Вопрос

Каков надежный способ защиты от sql-инъекции для классического asp-приложения?

К вашему сведению, я использую его с базой данных access.(Я не писал приложение)

Это было полезно?

Решение

Хранимые процедуры и / или подготовленные инструкции:

https://stackoverflow.com/questions/1973/what-is-the-best-way-to-avoid-sql-injection-attacks

Могу ли я защититься от SQL-инъекции, экранировав одинарные кавычки и заключив пользовательский ввод в одинарные кавычки?

Перехват SQL-инъекций и других вредоносных веб-запросов

С Access DB вы все еще можете это сделать, но если вы уже беспокоитесь о SQL-инъекции, я думаю, вам все равно нужно отключить Access.

Вот ссылка на методику в Access:

http://www.asp101.com/samples/storedqueries.asp

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

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

Conn.Execute("EXEC usp_ImOnlySafeIfYouCallMeRight '" + param1 + "', '" + param2 + "'") ;

Помните, что ваша база данных должна защищать свой собственный периметр, и если различные логины имеют права на INSERT/UPDATE/DELETE в таблицах любой код в этих приложениях (или скомпрометированных приложениях) может представлять потенциальную проблему.Если логины имеют права только на выполнение хранимых процедур, это формирует воронку, с помощью которой вам гораздо легче обеспечить корректное поведение.(Аналогично концепциям OO, где объекты отвечают за свои интерфейсы и не раскрывают всю свою внутреннюю работу.)

Другие советы

Вот пара скриптов sqlinject, которые я создал давным-давно, простая версия и расширенная версия:

function SQLInject(strWords) 
dim badChars, newChars, i
badChars = array("select", "drop", ";", "--", "insert", "delete", "xp_") 
newChars = strWords 
for i = 0 to uBound(badChars) 
newChars = replace(newChars, badChars(i), "") 
next 
newChars = newChars 
newChars= replace(newChars, "'", "''")
newChars= replace(newChars, " ", "")
newChars= replace(newChars, "'", "|")
newChars= replace(newChars, "|", "''")
newChars= replace(newChars, "\""", "|")
newChars= replace(newChars, "|", "''")
SQLInject=newChars
end function 


function SQLInject2(strWords)
dim badChars, newChars, tmpChars, regEx, i
badChars = array( _
"select(.*)(from|with|by){1}", "insert(.*)(into|values){1}", "update(.*)set", "delete(.*)(from|with){1}", _
"drop(.*)(from|aggre|role|assem|key|cert|cont|credential|data|endpoint|event|f ulltext|function|index|login|type|schema|procedure|que|remote|role|route|sign| stat|syno|table|trigger|user|view|xml){1}", _
"alter(.*)(application|assem|key|author|cert|credential|data|endpoint|fulltext |function|index|login|type|schema|procedure|que|remote|role|route|serv|table|u ser|view|xml){1}", _
"xp_", "sp_", "restore\s", "grant\s", "revoke\s", _
"dbcc", "dump", "use\s", "set\s", "truncate\s", "backup\s", _
"load\s", "save\s", "shutdown", "cast(.*)\(", "convert(.*)\(", "execute\s", _
"updatetext", "writetext", "reconfigure", _
"/\*", "\*/", ";", "\-\-", "\[", "\]", "char(.*)\(", "nchar(.*)\(") 
newChars = strWords
for i = 0 to uBound(badChars)
Set regEx = New RegExp
regEx.Pattern = badChars(i)
regEx.IgnoreCase = True
regEx.Global = True
newChars = regEx.Replace(newChars, "")
Set regEx = nothing
next
newChars = replace(newChars, "'", "''")
SqlInject2 = newChars
end function

"Надежный способ защиты от sql-инъекции для классического приложения asp" - это безжалостная проверка всех входных данных.Точка.

Сами по себе хранимые процедуры и / или другая система баз данных не обязательно обеспечивают хорошую безопасность.

MS недавно выпустила инструмент проверки SQL-инъекций, который ищет непроверенные входные данные, используемые в запросе.ЭТО то, что вам следует искать.

Вот ссылка:Для поиска уязвимостей SQL-инъекций в ASP-коде доступен инструмент Microsoft Source Code Analyzer for SQL Injection

Используя параметризованные запросы, вам нужно создать объект command, присвоить ему параметры с именем и значением, если вы это сделаете, вам не нужно будет беспокоиться ни о чем другом (ссылаясь на sql-инъекцию, конечно ;))

http://prepared-statement.blogspot.com/2006/02/asp-prepared-statements.html

И не доверяйте хранимым процедурам, они тоже могут стать вектором атаки, если вы не используете подготовленные инструкции.

если хранимые процедуры не подходят - и даже если они подходят - тщательно проверяйте все входные данные

Эй, любая база данных так же хороша, как разработчик, который ее использует.

Не больше, но и не меньше.

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

И если вы хороший разработчик, вы не будете использовать встроенные инструкции SQL на своих ASP-страницах.Даже в Access у вас есть возможность создавать и использовать запросы..

Хранить процедуры с проверкой данных вместе с HTML-кодированием - лучший способ предотвратить любые атаки с использованием SQL-инъекций.

Тот Самый Анализатор исходного кода Microsoft для SQL-инъекции доступен для поиска уязвимостей SQL-инъекций в ASP-коде

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top