3

我继承了大量目前缺少 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) 从我可以通过转义单引号和用单引号包围用户输入来防止 SQL 注入中的答案吗? 我读到“对'引用参数'过程发起攻击的一种方法是使用字符串截断。根据 MSDN,在 SQL Server 2000 SP4(和 SQL Server 2005 SP1)中,太长的字符串将被悄悄地截断。”

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

3) 还有其他我应该注意的问题吗?还有其他注入 SQL 的方法吗?

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

4

2 回答 2

9

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

在 PHP 中,PDO(和准备好的语句)也允许开发人员使用参数化查询来避免 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 
...

有关更多信息,请参阅我在上面发布的文章链接,或者如果您愿意,您可能想对该主题进行更多研究。

于 2012-06-13T18:16:25.800 回答
2

我使用了两层防御:

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