ADODB.Recordset错误'800a0bb9'参数类型错误,超出可接受范围或彼此冲突

时间:2013-11-12 17:48:23

标签: asp-classic sql-injection parameterized-query

我有一个使用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。

2 个答案:

答案 0 :(得分:2)

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

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

然后将 param1 的分配更改为:

Set param1 = objCommand.CreateParameter ("@whatSector",adVarChar, adParamInput, 50)

答案 1 :(得分:2)

好的..问题解决了

如果

,我在结束后移动了最后两行
set rs_client = server.CreateObject("ADODB.Recordset")
rs_client.open strSQL,adoCon

到ELSE之前的上面

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

感谢dmarietta: - )