我继承了大量目前缺少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注入。是这样,还是我在搜索的基本任务中真的失败了?
答案 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)
我使用两层防御: