Существующее имя пользователя не работает для некоторых имен пользователей, почему?
Ко всем чертям,
У меня есть веб-приложение, которое проверяет, существует ли пользователь в трех таблицах. Если пользователь существует в таблицах 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.Текст + ")'"
Richard Deeming
Ваш код уязвим для SQL-инъекция[^]. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.
Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов / OWASP[^]