我有一个使用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。
答案 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: - )