Классическая защита от инъекций ASP SQL

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

К вашему сведению, я использую его с БД доступа. (Я не писал приложение)


person Daniel A. White    schedule 29.09.2008    source источник


Ответы (8)


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

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

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

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

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

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

person Cade Roux    schedule 29.09.2008

Вот несколько скриптов 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
person Plippie    schedule 09.08.2011

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

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

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

person albertein    schedule 29.09.2008
comment
Сохраненные процедуры не являются ответом (даже если он не использовал Access), потому что вы все еще можете писать вводимый код, используя SP (я видел это). Это параметризованные запросы, которые защищают вас. - person Flory; 29.09.2008
comment
@ Флори, разве он не так говорит? - person Abel; 30.07.2010
comment
@ Абель, да. Не знаю, что курил два года назад. - person Flory; 30.07.2010

«Сильный способ защиты от внедрения sql для классического приложения asp» - это безжалостная проверка всех вводимых данных. Период.

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

Недавно MS выпустила инструмент SQL Injection Inspection, который ищет непроверенные входные данные, которые используются в запросе. ЭТО то, что вам следует искать.

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

person AnonJr    schedule 04.10.2008

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

person Steven A. Lowe    schedule 29.09.2008

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

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

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

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

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

person alexsts    schedule 21.02.2011

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

person BigJump    schedule 21.07.2009

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

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

person Brendan Enrick    schedule 29.09.2008