这足以抵御SQL注入吗?

时间:2012-08-01 21:10:55

标签: sql-server asp-classic sql-injection query-parameters

我正在尝试使用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")
    ... 

2 个答案:

答案 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

在代码中明确指定参数类型来解决此问题