1

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

2 回答 2

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 提供了这一点。

于 2012-08-01T21:54:25.937 回答
1

是的,您在问题中提供的代码受到 Sql Injections 的保护。

但是,正如这篇关于缓解 Sql Injection的文章中所指出的,您的代码将出现“一个较小的性能问题,因为 ADODB 必须在执行查询之前对 SQL 进行一次往返以确定参数类型。”

您可以通过在代码中显式指定参数类型来解决此问题CreateParameter

于 2012-08-01T21:54:08.803 回答