36

什么是防止经典 asp 应用程序的 sql 注入的有效方法?

仅供参考,我将它与访问数据库一起使用。(我没有写应用程序)

4

8 回答 8

28

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

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

我可以通过转义单引号和用单引号包围用户输入来防止 SQL 注入吗?

捕获 SQL 注入和其他恶意 Web 请求

使用 Access DB,您仍然可以做到这一点,但如果您已经担心 SQL 注入,我认为您无论如何都需要离开 Access。

这是 Access 中技术的链接:

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

请注意,通常防止注入的不是存储过程本身,而是它是参数化的而不是动态的这一事实。请记住,即使构建动态代码的 SP 如果以某些方式使用参数来构建动态代码,也可能容易受到注入攻击。总的来说,我更喜欢 SP,因为它们形成了应用程序访问数据库的接口层,因此应用程序甚至不允许首先执行任意代码。

此外,如果不使用命令和参数,存储过程的执行点可能会受到攻击,例如,这仍然很容易受到攻击,因为它是动态构建的并且可以成为注入目标:

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

请记住,您的数据库需要保护自己的边界,并且如果各种登录都有权访问INSERT/UPDATE/DELETE表,那么这些应用程序(或受感染的应用程序)中的任何代码都可能成为潜在问题。如果登录仅有权执行存储过程,这将形成一个漏斗,您可以通过它更轻松地确保正确的行为。(类似于 OO 概念,其中对象负责其接口并且不公开其所有内部工作。)

于 2008-09-29T17:50:34.297 回答
10

这是我很久以前制作的几个 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
于 2011-08-09T11:59:34.673 回答
4

使用参数化查询,您需要创建一个命令对象,为它分配一个名称和一个值的参数,如果这样做,您就不需要担心其他任何事情(当然是指 sql 注入;))

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

并且不要相信存储过程,如果您不使用准备好的语句,它们也可能成为攻击媒介。

于 2008-09-29T17:50:54.997 回答
4

“为经典的 asp 应用程序防止 sql 注入的一种强有力的方法”是无情地验证所有输入。时期。

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

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

这是链接: Microsoft Source Code Analyzer for SQL Injection 工具可用于查找 ASP 代码中的 SQL 注入漏洞

于 2008-10-04T19:34:23.013 回答
1

如果存储过程不是一个选项 - 即使它们是 -彻底验证所有输入

于 2008-09-29T19:44:05.867 回答
1

嘿,任何数据库都和使用它的开发人员一样好。

不多也不少。

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

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

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

于 2011-02-21T21:51:53.910 回答
0

Microsoft Source Code Analyzer for SQL Injection 工具可用于查找 ASP 代码中的 SQL 注入漏洞

于 2009-07-21T10:01:31.750 回答
-2

至少切换到 SQL Express 是一个不错的选择。这将使事情更加安全。即使使用参数和存储过程可以提供很大帮助。我还建议您仔细验证输入以确保它们符合您的预期。

对于像数字这样的值,提取数字以验证它确实只是一个数字是相当容易的。转义 SQL 的所有特殊字符。这样做可以防止尝试的攻击起作用。

于 2008-09-29T19:49:05.103 回答