Computer Wiz99 Ответов: 1

Существующее имя пользователя не работает для некоторых имен пользователей, почему?


Ко всем чертям,

У меня есть веб-приложение, которое проверяет, существует ли пользователь в трех таблицах. Если пользователь существует в таблицах table2 и table3, то он может создать имя пользователя и пароль. Если пользователь существует в таблице 1, то он не может создать имя пользователя и пароль. До сих пор это работает на некоторых учетных записях пользователей, которые мы тестировали, но на других мы можем создавать двойные имена пользователей с разными паролями. Пожалуйста, дайте мне знать, где я ошибаюсь. Есть ли способ сделать это лучше?

protected void Page_Load(object sender, EventArgs e)
        {
            if (IsPostBack)
            {
                SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["C3POConnectionString"].ConnectionString);
                con.Open();

                string cmdStr = "Select count(*) from Table1 where EmailAddress='" + TextBoxEA.Text + "'";
                string cmdStr2 = "Select count(*) from Table2 where EmailAddress='" + TextBoxEA.Text + "'";
                string cmdStr3 = "Select count(*) from Table3 where EmailAddress='" + TextBoxEA.Text + "'";

                SqlCommand userExist = new SqlCommand(cmdStr, con);
                SqlCommand userExist2 = new SqlCommand(cmdStr2, con);
                SqlCommand userExist3 = new SqlCommand(cmdStr3, con);

                SqlCommand cmd = new SqlCommand("select USERID, EmailAddress from Table1", con);
                SqlCommand cmd2 = new SqlCommand("select USERID, EmailAddress from Table2", con);
                SqlCommand cmd3 = new SqlCommand("select USERID, EmailAddress from Table3", con);

                userExist.Parameters.AddWithValue("@EmailAddress", TextBoxEA.Text);
                userExist.Parameters.AddWithValue("@Password", TextBoxPW.Text);
                userExist2.Parameters.AddWithValue("@EmailAddress", TextBoxEA.Text);
                userExist2.Parameters.AddWithValue("@Password", TextBoxPW.Text);
                userExist3.Parameters.AddWithValue("@EmailAddress", TextBoxEA.Text);
                userExist3.Parameters.AddWithValue("@Password", TextBoxPW.Text);

                int temp = Convert.ToInt32(userExist.ExecuteScalar().ToString());
                int temp2 = Convert.ToInt32(userExist2.ExecuteScalar().ToString());
                int temp3 = Convert.ToInt32(userExist3.ExecuteScalar().ToString());

                <pre>if (temp == 1)
                {
                    ScriptManager.RegisterStartupScript(this, this.GetType(), "script", "alert('Sorry, This User and Passsword Already Exists');", true);
                    TextBoxEA.Text = string.Empty;
                    TextBoxINST_ID.Text = string.Empty;
                    TextBoxaccessLevel.Text = string.Empty;
                    TextBoxEA.Focus();
                }
                else if (temp2 == 1 && temp3 == 1)
                {

                }
                else if (temp2 == 0 || temp3 == 0) 
                {
                    ScriptManager.RegisterStartupScript(this, this.GetType(), "script", "alert('User Name is Not Recognized by the System. Your Accreditation Liaison Officer (ALO) has permissions to this page. Please contact your ALO.');", true);
                    TextBoxEA.Text = string.Empty;
                    TextBoxEA.Focus();
                }
con.Close();
            }
        }


Что я уже пробовал:

Я пытался добавить код к temp2 и temp3, и они работают время от времени.

Jochen Arndt

Есть ли уже дубликаты в Таблице 1?

Затем вы должны проверить, что температура не равна нулю, а не сравнивать с 1:

если (temp)
{
// Пользователь существует
}

Computer Wiz99

Когда мы тестировали его, в таблице 1 были дубликаты, но в таблице 2 и Таблице 3 их нет. Таблица 1 содержит имя пользователя и пароль. Таблицы 2 и 3 содержат профили пользователей.

Jochen Arndt

Когда есть дубликаты, temp будет больше 1, потому что у вас есть запрос COUNT, который возвращает количество найденных совпадающих наборов перекодировок.

Но вы проверяете temp == 1 в самом первом месте, которое тогда не совпадает, и вы, вероятно, генерируете еще один дубликат.

Computer Wiz99

Ладно, я вижу, к чему ты клонишь. Теперь у меня есть одно имя пользователя и пароль в таблице 1. Я снова запускаю программу.

Computer Wiz99

Хорошо, я протестировал его на двух разных учетных записях пользователей. На одном это сработало. Имя пользователя выходит в таблицах table1, table2 и table3. Второй не сработал. Второй находится в таблицах table1, table2 и table3, но никакого сообщения об ошибке не появляется, и это позволяет мне создать другое имя пользователя и пароль для этого пользователя. Теперь у меня есть два одинаковых имени пользователя в таблице 1. Я вообще не менял свой код.

Jochen Arndt

Может быть, проблема с делом (Джо против Джо)?

Затем используйте что-то вроде
"...Где LOWER (EmailAddress)=LOWER ('"+TextBoxEA.Текст + ")'"

1 Ответов

Рейтинг:
7

Bryian Tan

Эти две линии должны быть объединены в соответствии с вашими требованиями

else if (temp2 == 1)
{

}
else if (temp3 == 1)
{

}

К
else if (temp2 == 1 && temp3 == 1)
{

}

Эта таблица может помочь вам лучше визуализировать его
temp2 	temp3 	Action
  0 	  0 	  User Name is Not Recognized
  0 	  1 	  User Name is Not Recognized
  1 	  0 	  User Name is Not Recognized
  1 	  1 	  user can create a username and password

Затем вы можете объединить код в нечто вроде

else if (temp2 == 0 || temp3 == 0) 
{
  ScriptManager.....
}


Computer Wiz99

Брайан Тан, Спасибо за новый код. Когда я тестировал его, и он работал хорошо, но когда я ввожу пользователя, который существует в таблицах table1, table2 и table3, появляется сообщение ScriptManager: имя пользователя не распознается системой. Ваш сотрудник по связям с аккредитацией (ALO) имеет права доступа к этой странице. Пожалуйста, свяжитесь с вашим ALO. Даже несмотря на то, что они есть в таблицах. Как я могу это исправить?

Bryian Tan

хммм, возможно, вам придется снова опубликовать обновленный код. Или вы можете визуализировать его с помощью таблицы

Temp1 Temp2 Temp3 Действие
1 0 0
1 0 1
1 1 0
1 1 1
0 0 0
0 0 1
0 1 0
0 1 1

Computer Wiz99

Я обновил код.

Bryian Tan

Возможно, вам придется проверить запрос, потому что если temp1 и temp2 и temp3 = 1, основываясь на коде, он не должен показывать "имя пользователя не является ....."

Если 1,1,1 он должен показать "извините, этот пользователь и Password уже существуют"?

Computer Wiz99

Итак, если temp = 0 для таблицы 1, то пользователь должен иметь возможность создать имя пользователя и пароль.

Если temp = 1 для таблицы 1, то пользователь не сможет создать имя пользователя и пароль.
Так и должно быть.

Bryian Tan

Я думаю, что то, что ваш код делает сейчас, если только запрос не вернет неправильное значение. Убедитесь,что temp, temp2, temp3 имеют правильное возвращаемое значение.

если (temp == 1)
-- Извините, этот пользователь и Password уже существуют

иначе если (temp2 == 1 & & amp; temp3 == 1)
-- Здесь... temp=0 и пользователь существует как в table2, так и в table3 -- Create username password

иначе если (temp2 == 0 | / temp3 == 0)
-- temp =0, temp2 = = 0 или temp3 == 0 - имя пользователя не распознается...

Bryian Tan

Кстати, после того как вы все уладите, взгляните на эту статью SQL-инъекция и межсайтовые Скрипты[^]. Вы можете следовать предложению @Richard Deeming о том, как исправить эту уязвимость