经典 ASP SQL 注入保护
Posted
技术标签:
【中文标题】经典 ASP SQL 注入保护【英文标题】:Classic ASP SQL Injection Protection 【发布时间】:2010-09-14 01:43:53 【问题描述】:对于经典的 asp 应用程序来说,防止 sql 注入的有效方法是什么?
仅供参考,我将它与访问数据库一起使用。 (我没有写应用程序)
【问题讨论】:
另见How can I make a prepared statement in classic asp that prevents sql injection? 【参考方案1】:存储过程和/或准备好的语句:
https://***.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 DB,你仍然可以做到,但如果你已经担心 SQL 注入,我认为你还是需要离开 Access。
这是 Access 中的技术链接:
http://www.asp101.com/samples/storedqueries.asp
请注意,通常防止注入的不是存储过程本身,而是它是参数化的而不是动态的这一事实。请记住,即使构建动态代码的 SP 如果以某些方式使用参数来构建动态代码,也可能容易受到注入的影响。总的来说,我更喜欢 SP,因为它们形成了应用程序访问数据库的接口层,因此应用程序甚至一开始就不允许执行任意代码。
此外,如果不使用命令和参数,存储过程的执行点可能会受到攻击,例如这仍然很容易受到攻击,因为它是动态构建的并且可以成为注入目标:
Conn.Execute("EXEC usp_ImOnlySafeIfYouCallMeRight '" + param1 + "', '" + param2 + "'") ;
请记住,您的数据库需要保护自己的边界,并且如果各种登录名有权访问表中的INSERT/UPDATE/DELETE
,那么这些应用程序(或受感染的应用程序)中的任何代码都可能成为潜在问题。如果登录仅有权执行存储过程,这将形成一个漏斗,您可以通过它更轻松地确保正确的行为。 (类似于 OO 概念,其中对象负责其接口并且不公开其所有内部工作。)
【讨论】:
【参考方案2】:这是我很久以前制作的几个 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
【讨论】:
【参考方案3】:使用参数化查询,你需要创建一个命令对象,给它分配一个名称和一个值的参数,如果你这样做你就不需要担心其他任何事情(当然是指 sql 注入;))
http://prepared-statement.blogspot.com/2006/02/asp-prepared-statements.html
不要相信存储过程,如果你不使用准备好的语句,它们也可能成为攻击媒介。
【讨论】:
存储过程不是答案(即使他没有使用 Access),因为您仍然可以使用 SP 编写可注入代码(我见过)。保护您的是参数化查询。 @Flory,这不正是他所说的吗? @Abel,确实如此。我不知道两年前我在抽什么。【参考方案4】:“防止经典asp应用程序sql注入的一种强有力的方法”是无情地验证所有输入。期间。
单独的存储过程和/或不同的数据库系统不一定等同于良好的安全性。
MS 最近推出了一个 SQL 注入检查工具,用于查找查询中使用的未经验证的输入。这就是您应该寻找的。p>
这是链接: The Microsoft Source Code Analyzer for SQL Injection tool is available to find SQL injection vulnerabilities in ASP code
【讨论】:
【参考方案5】:如果存储过程不是一个选项 - 即使它们是 - 彻底验证所有输入
【讨论】:
【参考方案6】:嘿,任何数据库都和使用它的开发人员一样好。
不多也不少。
如果您是优秀的开发人员,您可以使用文本文件作为数据库来构建电子商务网站。 是的,它不会像 Oracle 驱动的网站那么好,但对于像家庭定制珠宝制造这样的小型企业来说,它会做得很好。
如果您是优秀的开发人员,您将不会在您的 ASP 页面上使用内联 SQL 语句。 即使在 Access 中,您也可以选择构建和使用查询..
带有数据验证的存储过程以及 html 编码 - 是防止任何 SQL 注入攻击的最佳方法。
【讨论】:
【参考方案7】:Microsoft Source Code Analyzer for SQL Injection tool 可用于查找 ASP 代码中的 SQL 注入漏洞
【讨论】:
【参考方案8】:至少切换到 SQL Express 是一个不错的选择。这将使事情更加安全。即使使用参数和存储过程可以提供很大帮助。我还建议您仔细验证输入,以确保它们符合您的预期。
对于像数字这样的值,提取数字以验证它确实只是一个数字是相当容易的。转义 SQL 的所有特殊字符。这样做可以防止尝试的攻击起作用。
【讨论】:
以上是关于经典 ASP SQL 注入保护的主要内容,如果未能解决你的问题,请参考以下文章