2008-09-29 99 views

回答

26

存储程序和/或准备的语句:

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

Can I protect against SQL Injection by escaping single-quote and surrounding user input with single-quotes?

Catching SQL Injection and other Malicious Web Requests

使用Access数据库,你仍然可以做到这一点,但如果你已经担心SQL注入,我认为你无论如何都需要关闭Access。

下面是访问技术的链接:

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

注意什么典型的注射保护不是存储过程本身,但事实上,它是参数化不是动态的。请记住,即使构建动态代码的SP如果以特定方式使用参数来构建动态代码,也可能容易受到注入攻击。总的来说,我更喜欢SP,因为它们构成了应用程序到达数据库的接口层,所以应用程序甚至不允许首先执行任意代码。

此外,如果您不使用命令和参数(例如,),存储过程的执行点可能会受到攻击。这仍然是脆弱的,因为它是动态生成的,可以是注入目标:

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

记住,你的数据库需要保卫自己的边界,如果各种登录表格有权INSERT/UPDATE/DELETE,在这些应用中的任何代码(或妥协的应用程序)可能是一个潜在的问题。如果登录只有执行存储过程的权限,这就形成了一个漏斗,通过它你可以更容易地确保正确的行为。 (类似于OO概念,其中对象负责其接口并且不暴露它们的所有内部工作)。

3

使用参数化查询,您需要创建一个命令对象,为其分配带有名称和值的参数if你这样做,你就不需要担心任何东西(指的当然SQL注入;))

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

而且不信任的存储过程,它们可以成为攻击向量太多,如果你不不使用预先准备的语句。

+0

存储过程并不是答案(即使他没有使用Access),因为你仍然可以使用SP编写注入代码(我已经看到它)。它是保护你的参数化查询。 – Flory 2008-09-29 19:49:15

1

如果存储过程是不是一种选择 - 即使他们是 - 验证所有输入至少是彻底

-2

切换到SQL Express是一个很好的选择。它会使事情变得更加安全。尽管使用参数和存储过程可以帮助很大。我还建议您仔细验证输入,以确保它们符合您的期望。

对于像数字这样的值,提取数字以确认它确实只是一个数字是相当容易的。为SQL退出所有特殊字符。这样做可以防止尝试的攻击发挥作用。

4

“一个强大的方法来防止传统的ASP应用程序的SQL注入”是无情地验证所有输入。期。

单独的存储过程和/或不同的数据库系统并不一定具有良好的安全性。

MS最近推出了一个SQL注入检测工具,用于查找查询中使用的未验证输入。这是你应该寻找的。

这里的链接: The Microsoft Source Code Analyzer for SQL Injection tool is available to find SQL injection vulnerabilities in ASP code

1

嘿,因为谁使用它开发好任何数据库。

没有更多,但没有少。

如果您是一位优秀的开发人员,您可以使用文本文件作为数据库来构建电子商务网站。 是的,它不会像甲骨文驱动的网站一样好,但它对于像家庭,定制珠宝制造这样的小型企业来说可以做得很好。

如果您是一位优秀的开发人员,您将不会在ASP页面上使用内联SQL语句。 即使在Access中,您也可以选择构建和使用查询。

存储数据验证过程以及html编码 - 是防止任何SQL注入攻击的最佳方法。

8

这里有几个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