вопрос впрыска sql - PullRequest
       2

вопрос впрыска sql

2 голосов
/ 10 мая 2011

У меня есть следующий фрагмент кода.

SqlCommand cmd = new SqlCommand("SELECT FName,LName FROM EMPLOYEE_TABLE WHERE EmployeeID = '" +TextBox1.Text + "' AND Password = '"+ TextBox2.Text +"'", con);
SqlDataReader x = cmd.ExecuteReader();

try
{ 
    if (x.Read())
    {
        name = (string)x["FName"] +' '+ (string)x["LName"];
        Session["NAME"] = name;
        Session["ID"] = TextBox1.Text;
        Response.Redirect("sample.aspx?action=On_Click");
    }
    else
    {
        errormsg.Text = "login failed.Please enter Valid UserID and Password";
        errormsg.ForeColor = System.Drawing.Color.Red;
    }
}
catch (Exception exp)
{
    errormsg.Text = "Sorry,You dont have access to this portal.";
}
finally
{
    x.Close();
    con.Close();
}

Теперь, когда я использую действительный идентификатор (который существует) и пароль как abc 'или' x '=' x , он входит в первую учетную запись таблицы в базе данных. Пока это нормально.

Однако, когда я пытаюсь отладить код, он выдает ошибку Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack..

Кроме того, если он выдает ошибку, то почему он входит в эту первую учетную запись базы данных. Примечание: первая учетная запись базы данных имеет другой идентификатор пользователя, чем тот, который я предоставляю.

Примечание: я разработал это приложение. Так что я не делаю ничего противозаконного. :)

Ответы [ 3 ]

3 голосов
/ 10 мая 2011

Посмотрите на эту часть вашего SQL:

   "' AND Password = '"+ TextBox2.Text +"'"

С вашим паролем это

   "' AND Password = ''x'='x'"

это не тот SQL, который вам нужен.

Даже если вы пытаетесь выполнить SQL-инъекцию, вы должны получить правильный SQL. Обычно это завершает оператор точкой с запятой после закрытия кавычки. Смотрите это:

enter image description here http://xkcd.com/327/

1 голос
/ 10 мая 2011

ОК, чтобы ответить на основную проблему, которая у вас возникла (как вы уже сказали, вы новичок в проблеме SQL-инъекций).

Инъекция SQL вызвана динамическим построением запроса SQL с использованием пользовательского ввода как части конструкции. Самое простое решение этого в .Net - создать параметризованный запрос.

Я думаю, что у Джеффа Этвуда самая полная, но лаконичная статья с объяснением и полным примером здесь

Цитата сверху ссылка:

SqlConnection conn = new SqlConnection(_connectionString);
conn.Open();
string s = "SELECT email, passwd, login_id, full_name " + 
  "FROM members WHERE email = @email";
SqlCommand cmd = new SqlCommand(s);
cmd.Parameters.Add("@email", email);
SqlDataReader reader = cmd.ExecuteReader();

Проблема под рукой:

Причина, по которой он все еще входит в учетную запись, заключается в том, что запрос все еще "действителен".

Оператор по-прежнему будет выполняться, и соответствующая запись будет по-прежнему возвращаться из базы данных, исключение не выдается.

Единственный способ остановить процесс входа в систему, если указаны неверные данные, - это проверить ввод перед выполнением запроса. Вы должны всегда проверять пользовательский ввод перед тем, как отправит его в базу данных. Если пользователь должен был предоставить:

username'; drop table users;--

как имя пользователя, вы будете иметь LOT неприятностей.

0 голосов
/ 10 мая 2011

Ошибка, с которой вы сталкиваетесь, является ошибкой отладки, а не фактическим исключением программы. Вот почему это работает, когда вы запускаете его нормально.

Чтобы исправить ошибку, я сначала должен убедиться, что все работает с помощью отладочной сборки. Кроме того, убедитесь, что вы в настоящее время отлаживаете функцию переменной, которую вы хотите проверить. Попробуйте пройти (F10) несколько раз за точку останова, чтобы обновить контекст. В Интернете есть множество других предложений для этой конкретной ошибки, поэтому, если у вас все еще есть проблемы, вам, возможно, придется поискать в Google.

...