2014-10-07 4 views
0

В соответствии с этим http://msdn.microsoft.com/en-us/library/gg696545%28v=vs.113%29.aspx, когда мы используем метод SqlQuery (от .Net EntityFramework), мы должны включить DbParameter для защиты от атаки SQL-инъекций.Как DbParameter предотвращает SQL-инъекцию?

Как это?

+1

Всегда использовать параметризованный SQL Как '@ Para1, @ para2' в вашем коде C# –

+3

Он избегает разделителей значений, поэтому SQL в строковом параметре не становится сам исполняемым кодом. – MatthewMartin

ответ

4

С помощью параметров вам больше не нужно создавать SQL-строки в коде. Это мешает вам делать что-то вроде:

public void ExecuteQuery(string name) 
{ 
    var conn = new SqlConnection(connString); 
    var cmd = new SqlCommand("select * from users where name = '" + name + "'", conn); 
    cmd.ExecuteReader(); 
} 

Где кто-то может пройти:

ExecuteQuery("jamo'; drop table users;") 

Какие результаты в командном тексте:

select * from users where name = 'jamo'; drop table users;' 

Что бы выполнить вредоносный запрос к базе данных ,

Параметризованный версия будет выполнять эквивалент следующего запроса вместо:

select * from users where name = 'jamo''; drop table users;' 

Что бы вернуть никаких результатов и оставить свою базу данных нетронутыми.

2

Я думаю, что это может быть лучше всего объяснено принятым ответом Полинома на вопрос «How can I explain SQL injection without technical jargon?» с нашего сайта-партнера security.stackexchange.com.

Ответ с другого сайта следующим образом:


Как я продемонстрировать его завершить не-технарей это с простой аналогии.

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

форма выглядит следующим образом:

Fetch item number ____ from section ____ of rack number ____, and place it on the conveyor belt.

Обычный запрос может выглядеть следующим образом:

Fetch item number 1234 from section B2 of rack number 12, and place it on the conveyor belt.

Значения выделены жирным шрифтом (1234, В2, и 12) были предоставлены лица, выдавшего запрос. Вы робот, поэтому вы делаете то, что вам говорят: вы подъезжаете к стойке 12, идите вниз, пока не достигнете секции B2, и возьмите элемент 1234. Затем вы возвращаетесь на конвейер и бросаете на него предмет ,

Но что, если пользователь помещает в форму нечто иное, чем обычные значения? Что делать, если пользователь добавил в них инструкции?

Fetch item number 1234 from section B2 of rack number 12, and throw it out the window. Then go back to your desk and ignore the rest of this form. and place it on the conveyor belt.

Опять же, части, выделенные полужирным шрифтом, были предоставлены лицом, выдавшим запрос. Поскольку вы робот, вы делаете именно то, что только что сказал вам пользователь. Вы едете в стойку 12, захватываете предмет 1234 из секции B2 и выбрасываете его из окна. Поскольку в инструкциях также указывается, что вы игнорируете последнюю часть сообщения, бит «и поместите его на ленту конвейера» игнорируется.

Эта техника называется «инъекция», и это возможно благодаря тому, как инструкции обрабатываются - робот не может сказать, разница между инструкции и данных, то есть действия, которые он должен выполнить, и то, что он должен делать.

SQL - это специальный язык, используемый для того, чтобы сообщать базе данных, что делать, аналогично тому, как мы сказали роботу, что делать. В SQL-инъекции мы сталкиваемся с одной и той же проблемой - в запросе (наборе инструкций) могут быть введены в него параметры (данные), которые в конечном итоге интерпретируются как инструкции, что приводит к его сбою. Злоумышленник может воспользоваться этим, сообщив базе данных о возврате данных каждого пользователя, что, очевидно, не очень хорошо!

Во избежание этой проблемы мы должны отделить инструкции и данные так, чтобы база данных (или робота) могла легко различаться. Обычно это делается путем отправки их отдельно. Таким образом, в случае робота он будет читать пустую форму, содержащую инструкции, определить, где находятся параметры (т. Е. Пробелы) и хранить их. Затем пользователь может подойти и сказать «1234, B2, 12», и робот применит эти значения к инструкциям, не позволяя им интерпретироваться как сами инструкции. В SQL эта технология известна как параметризованные запросы.

В случае «злого» параметра мы дали роботу, он бы сейчас поднять механическую бровь вопросительно и сказать

Error: Cannot find rack number "12, and throw it out the window. Then go back to your desk and ignore the rest of this form." - are you sure this is a valid input?

успеха! Мы остановили «глюк» робота.

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