1

我有一个使用 ASP Classic 的旧网站,最近有人要求我删除 SQL 注入攻击威胁。我正在尝试使用参数化查询,但这一切都超出了我的想象。

这是我的代码:

<% whatSector = request.querystring("whatSector")%>

    <%  adoCon.Open cString
        dim rs_client
        if whatSector="" then
    strSQL="SELECT * FROM clients ORDER BY alphabet"
    else

    Set objCommand = Server.CreateObject("ADODB.COMMAND")

    strCmd1 = "SELECT * FROM clients Where industrySector=? ORDER BY alphabet"

    Set objCommand.ActiveConnection = adoCon
        objCommand.CommandText = strCmd1
        objCommand.CommandType = adCmdText

    Set param1 = objCommand.CreateParameter ("whatSector",adVarChar, adParamInput, 50)
    param1.value = whatSector
    objCommand.Parameters.Append(param1)
    Set rs_client = objCommand.Execute()

    end if 
    set rs_client = server.CreateObject("ADODB.Recordset")
    rs_client.open strSQL,adoCon

%>

这似乎在另一个页面上对我有用(除了出于某种原因我不得不删除我用于分页的 recordCount 东西),但我在此页面上收到以下错误:

ADODB.Recordset 错误“800a0bb9”

参数类型错误、超出可接受范围或相互冲突。

/clients/clientspotlight_list.asp,第 50 行

第 50 行 - 是上述代码片段末尾的 rs_client.open。

我用过

    <!-- METADATA TYPE="TypeLib" NAME="Microsoft ADO Type Library" UUID="{00000205-0000-0010-8000-00AA006D2EA4}" -->

对于 adovbs.inc。

4

2 回答 2

1

好的。。问题解决了

我在结束后移动了最后两行 if

set rs_client = server.CreateObject("ADODB.Recordset")
rs_client.open strSQL,adoCon

在 ELSE 之前

是的,就是这么简单.. 一个逻辑错误,由我的朋友向我指出——他在这里阅读了我的问题,并在其他地方指出了我正确的方向..

谢谢dmarietta :-)

于 2013-11-13T14:51:53.053 回答
1

看起来您的参数名称格式错误。尝试将strCmd1的分配更改为:

strCmd1 = "SELECT * FROM clients Where industrySector=@whatSector ORDER BY alphabet"

然后将param1的赋值改为:

Set param1 = objCommand.CreateParameter ("@whatSector",adVarChar, adParamInput, 50)
于 2013-11-12T19:13:07.377 回答