2014-10-14 2 views
0

эта программа при вводе имени пользователя и пароля перейдите в базу данных и сравните таблицу, но когда я ввожу имя пользователя admin, пароль admin (существует в таблице) ошибка compalier show « Неправильный синтаксис рядом 'админ' "в строке Int темп = Convert.ToInt32 (. com.ExecuteScalar() ToString());«Неправильный синтаксис рядом с« администратором »

protected void Button1_Click(object sender, EventArgs e) 
{ 

    SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\1\Documents\DB.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"); 
    conn.Open(); 
    string checkuser = "select count(*) from [Users] where Username '" + TextBoxUserName.Text + "'"; 
    SqlCommand com = new SqlCommand(checkuser,conn); 
    int temp = Convert.ToInt32(com.ExecuteScalar().ToString()); 
    conn.Close(); 

    if (temp == 1) 
    { 
     conn.Open(); 
     string checkpassword = "select Password from Users where Password'" + TextBoxPassword.Text + "'"; 
     SqlCommand passComm = new SqlCommand(checkpassword, conn); 
     string password = passComm.ExecuteScalar().ToString(); 
     if (password == TextBoxPassword.Text) 
     { 
      //Session["NEW"] = TextBoxUserName.Text; 
      Response.Redirect("Welcome.aspx"); 
     } 

     else 
     { 
      Response.Redirect("Error.aspx"); 
     } 

    } 
+3

Пожалуйста, прочитайте о инъекции SQL, вы уязвимы для него. Вот один из многих ресурсов, которые помогут вам начать работу: http://www.troyhunt.com/2013/07/everything-you-wanted-to-know-about-sql.html Сохранение паролей с открытым текстом в базе данных также как правило, хмурится. – Vache

ответ

0

Попробуйте изменить эту линию

string checkuser = "select count(*) from [Users] where Username '" + TextBoxUserName.Text + "'"; 

к этому

string checkuser = "select count(*) from [Users] where Username = '" + TextBoxUserName.Text + "'"; 

вы пропускаете = знак

вам нужно сделать то же самое для вашего пароля выбора, а также, вы пропустили = знак там.

string checkpassword = "select Password from Users where Password = '" + TextBoxPassword.Text + "'"; 
+0

спасибо, что это помогло –

0

При проверке пароля, вы должны также включать UserName:

string checkpassword = "select Password from Users where UserName = '" + TexBoxUserName.Text + "' AND Password = '" + TextBoxPassword.Text + "'"; 

Если вы не включают UserName тем он только проверяющим, что какой-то пользователь имеет пароль.

Следующий код предотвратит инъекцию SQL по paramterizing командной тексту

SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\1\Documents\DB.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"); 
conn.Open(); 
string checkuser = "SELECT Count(UserName) FROM USERS WHERE UserName = @UserName"; 
SqlCommand com = new SqlCommand(checkuser,conn); 
SqlParameter parmUserName = new SqlParameter("UserName", TextBoxUserName.Text); 
com.Parameters.Add(parmUserName); 

int temp = Convert.ToInt32(com.ExecuteScalar().ToString()); 
conn.Close(); 
if (temp == 1) 
    { 
     conn.Open(); 
     string checkpassword = "SELECT Password FROM USERS WHERE UserName = @UserName AND Password = @Password"; 

     SqlCommand passComm = new SqlCommand(checkpassword, conn); 
     SqlParameter parmPassword = new SqlParameter("Password", TextBoxPAssword.Text); 

     com.Parameters.Add(parmUserName); 
     com.Parameters.Add(parmPassword); 

     string password = passComm.ExecuteScalar().ToString(); 
1

ошибка просто вызываются отсутствующим равно перед значением сцепляется текст команды SQL.

Но, кроме того, ваш код неверен по другим причинам.

  • Вы должны всегда использовать параметризованный запрос, чтобы избежать Sql Injection и синтаксический анализ проблем,
  • Вы можете удалить функцию COUNT, что вызывает ненужную нагрузку всех записей только подтвердить существование вашего поиска данных
  • You вам нужно указать, что ваш пользователь ищет оба пароля и имя пользователя в ИМЕЮЩЕЙ записи, как и сейчас, код выше, сначала найдите имя пользователя , а затем пароль, но я могу ввести существующее имя пользователя (сначала, если оно прошло) и использовать пароль другого пользователя (второй, если он принят), а затем получить доступ к ваш сайт.

.

string checkuser = "IF EXISTS(select 1 from [Users] where Username = @usr AND [email protected]) 
        SELECT 1 ELSE SELECT 0"; 
using(SqlConnection conn = new SqlConnection(....))  
using(SqlCommand com = new SqlCommand(checkuser,conn)) 
{ 
    conn.Open(); 
    com.Parameters.AddWithValue("@usr", TextBoxUserName.Text); 
    com.Parameters.AddWithValue("@pwd", TextBoxPassword.Text); 
    int temp = Convert.ToInt32(com.ExecuteScalar()); 
    if (temp == 1) 
     Response.Redirect("Welcome.aspx"); 
    else 
     Response.Redirect("Error.aspx"); 
} 

Других вещи изменились в приведенном выше примере, являются ИСПОЛЬЗОВАНИЕМ ЗАЯВЛЕНИЯ, чтобы убедиться, что подключение и команды расположены в конце операции также в случае исключения

Смежные вопросы