针对SQL注入的经典ASP保护

时间:2012-06-13 18:11:23

标签: asp-classic sql-server-2000 sql-injection

我继承了大量目前缺少SQL注入保护的经典ASP代码,我正在努力。我已经详细研究了这里提供的解决方案:Classic ASP SQL Injection Protection 在数据库方面,我有一个Microsoft SQL Server 2000 SP4

不幸的是,存储过程不是一种选择。

在研究了php的mysql_real_escape_string(http://www.w3schools.com/php/func_mysql_real_escape_string.asp)后,我在ASP中复制了它的功能。

我的问题是:

1)Microsoft SQL Server 2000是否有任何其他需要转义的特殊字符,这些字符在MySQL中不存在(\ x00,\ n,\ r,\,',“,\ x1a)

2)从Can I protect against SQL Injection by escaping single-quote and surrounding user input with single-quotes?中的答案我读到“发起攻击的一种方法'引用参数'过程是字符串截断。根据MSDN,在SQL Server 2000 SP4(和SQL Server 2005) SP1),一个太长的字符串将被悄然截断。“

如何将其用于攻击(我真的无法想象这样的场景)以及防御它的正确方法是什么?

3)我还应该注意其他问题吗?注入SQL的其他任何方式?

注意:30分钟的互联网搜索表示,没有经典ASP的库可以防止SQL注入。是这样,还是我在搜索的基本任务中真的失败了?

2 个答案:

答案 0 :(得分:9)

最佳选择是使用参数化查询。关于如何完成,您必须查看:

在PHP中,PDO(和prepared statements)允许开发人员使用参数化查询来避免sql注入。


更新

是的,您可以在WHERE子句中指定参数,为此您可以使用ADODB.Command对象,如下例所示:

' other connection code
set objCommand = Server.CreateObject("ADODB.Command") 
...

strSql = "SELECT name, info FROM [companies] WHERE name = ?" _ 
    & "AND info = ?;" 
... 
objCommand.Parameters(0).value = strName 
objCommand.Parameters(1).value = strInfo 
...

有关详细信息,请参阅我上面发布的文章链接,或者您可能希望根据需要对该主题进行更多研究。

答案 1 :(得分:2)

我使用两层防御:

  • 创建一个'cleanparameter'函数,每个从查询字符串或表单值获取的调用都使用它来调用该函数。该函数至少应该替换简单的引号,并将字符串截断为您传递的值。因此,例如,如果字段不能超过100个字符,则可以将其称为x = cleanparameter(request.querystring(“x”),100)。这是第一道防线
  • 使用参数化查询来运行SQL指令