经典 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 注入保护的主要内容,如果未能解决你的问题,请参考以下文章

经典 ASP 跨站脚本

ASP.NET 中 SqlParameter是啥?具体怎么用?

在asp中加入了防止sql注入代码 如何输入符号

ASP.NET如何防止SQL注入

问一下asp 的 sql注入怎么办

asp怎么注入?