我正在尝试使用MS SQL 2008 R2(Express Edition)保护较旧的经典asp网站(大约有1,000个(.asp)页面)。
我找到了一个关于如何参数化查询的代码(见下文),代码看起来对我来说最容易在需要更改的所有页面上理解和使用。
我的问题是:如果我要转换所有ms sql查询(看起来类似于下面的代码)那么这足以防止ms sql注入攻击吗?还是有更多我需要添加/更改?
感谢您的帮助......
这是代码:
set objCommand = Server.CreateObject("ADODB.Command")
strSql = "SELECT * FROM users WHERE username=? AND password=?"
...
cmd1.Parameters(0) = Request.Form("login")
cmd1.Parameters(1) = Request.Form("password")
...
答案 0 :(得分:3)
自从我看到旧的Adodb命令语法以来已经有一段时间了,但我想你会想要这样的东西:
set objCommand = Server.CreateObject("ADODB.Command")
strSql = "Select * From users where username=@username and password=@password"
objCommand.Parameters.Append.CreateParameter
("@username", adVarChar, adParamInput, 50, Request.Form("login"))
objCommand.Parameters.Append.CreateParameter
("@password", adVarChar, adParamInput, 50, Request.Form("password"))
与往常一样,不要在没有类型安全参数编码的情况下创建动态sql语句,我想即使是老派ADO也是通过CreateParameter提供的。
答案 1 :(得分:1)
是的,您在问题中提供的代码可以防止Sql注入。
但是,as noted in this article on mitigating Sql Injection,您的代码将出现“一个小的性能问题,因为ADODB将不得不在执行查询之前对SQL进行往返以找出参数类型。”
您可以使用CreateParameter