Как объект sqlparameter предотвращения SQL-инъекции?


Что именно происходит в фоновом режиме, что делает это так SQLParameter предотвращает атаки с использованием SQL изгиба в .Чистая параметризованного запроса? Это просто удаление каких-либо подозрительных персонажей или есть что-то еще?

кто-нибудь там проверял, что на самом деле попадает на SQL Server, когда вы передаете вредоносный ввод?

по теме: можете ли вы использовать SQLParameter в инструкции SQL FROM?

4 59

4 ответа:

В основном, когда вы выполняете SQLCommand используя SQLParameters, параметры никогда не вставляются непосредственно в инструкцию. Вместо этого системная хранимая процедура называется sp_executesql вызывается и задается строка SQL и массив параметров.

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

проще для понимания, и более общий ответ звучит так:

представьте себе динамический SQL-запрос:

sqlQuery='SELECT * FROM custTable WHERE User=' + Username + ' AND Pass=' + password

простой SQL-инъекции было бы просто поставить имя Пользователя в качестве ' OR 1=1--

это будет эффективно сделать SQL запрос:

sqlQuery='SELECT * FROM custTable WHERE User='' OR 1=1-- ' AND PASS=' + password

это говорит, что выберите всех клиентов, где их имя пользователя пустое ('') или 1=1, который является логическим, приравнивая к true. Затем он использует -- to комментировать остальную часть запроса. Так что это будет распечатать весь таблица клиента, или позволяет вам делать все, что вы хотите с ним.

теперь параметризованные запросы делают это по-другому, с кодом типа:

sqlQuery='SELECT * FROM custTable WHERE User=? AND Pass=?' parameters.add("User", username) parameters.add("Pass", password)

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

теперь, на данный момент, Вы можете подумать, что это ничего не меняет. Конечно, вы все еще можете просто положить в поле username что-то вроде Nobody или 1=1'--, эффективно делая запрос:

sqlQuery='SELECT * FROM custTable WHERE User=Nobody OR 1=1'-- AND Pass=?'

и это было бы веским аргументом. Но вы были бы неправы.

способ работы параметризованных запросов заключается в том, что SQL-запрос отправляется как запрос, и база данных точно знает, что этот запрос будет делать, и только тогда он вставит имя пользователя и пароли просто как значения. Это означает, что они не могут повлиять на запрос, потому что база данных уже знает, что запрос будет делать. Так что в этом случае он будет искать имя пользователя Nobody OR 1=1'-- и пустой пароль,который должен быть ложным.

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

источник:http://www.lavamunky.com/2011/11/why-parameterized-queries-stop-sql.html

"коллекции параметров, такие как SqlParameterCollection, обеспечивают проверку типа и проверку длины. При использовании коллекции параметров входные данные обрабатываются как литеральное значение, а SQL Server не обрабатывает их как исполняемый код. Дополнительное преимущество использования коллекции параметров заключается в том, что вы можете применять проверки типа и длины. Значения вне диапазона вызывают исключение. Это хороший пример защиты в глубина."

http://msdn.microsoft.com/en-us/library/ff648339.aspx

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

используйте SqlParameters, но не забывайте о переполнении, недостаточном потоке и непроверенных параметрах. Например, если метод " proc buy_book (@price money)", злоумышленник будет пытаться обмануть приложение для запуска с @price значение 0.01, или попытка заставить приложение сделать что-то интересное, отправив что-то, что вызывает переполнение. Переполнение Sql как правило, они не интересны (т. е. они просто вызывают исключения, вы вряд ли сможете писать в соседнюю память)