参数化SQL查询命令对象不起作用

时间:2016-09-21 23:03:20

标签: vbscript sql-server-2012 asp-classic ado

我正在升级经典ASP / VBScript应用程序,以使用参数化SQL查询进行SQL注入预防。 使用sqlserver 2012.使用ADODB。

目标是允许更新表中的现有记录,并更正特定字段中的信息(一个字段仅用于测试目的)。
此列的表数据类型是varchar。

我已经在线查看了几种方法,并在应用程序中集成了其中一种方法,如下所示。

问题:代码无法在数据库中进行更改,尽管它没有错误地通过应用程序代码并指示已成功进行更正 - 但是数据库中的指定列没有进行任何更改。 p>

Dim cmd, oRSQ
Const adParamInput = 1
Const adLongVarChar = 201
Const adVarChar = 200

Set dbConn  = Server.CreateObject("ADODB.Connection")
dbConn.Open = "PROVIDER=SQLOLEDB;SERVER=.....etc"
Set cmd = Server.CreateObject("ADODB.Command")

With
    .ActiveConnection = dbConn
    .Prepared = True
    .CommandType = adCmdText
    .CommandText = "UPDATE mytable SET [followup_Care_Need_Room] = ? WHERE entry_ID = '1379'"
    .CommandTimeout = 900
    .Parameters.Append cmd.CreateParameter("@followupCareNeedRoom", adVarChar, adParamInput)
    cmd("@followupCareNeedRoom") = Request("followupCareNeedRoom").Item
End With
Set oRSQ = cmd.Execute

美国东部时间下午3点9/23更新信息 @AlexK:感谢您的反馈。我对你的观点的回答: -

(1)代码是我的代码,因为它是从我的HTML编辑器中复制/粘贴的。 (2)你是正确的,With语句中缺少一个对象。我在发布此问题后发现了这一点。 (3)我使用"?"的原因在SQL语句中,我正在努力准备'一个SQL语句,以防止SQL注入。

(4)当我最终使这个过程工作时,我将一次又一次地使用该语句来更新表中特定行的所有列;这就是我使用.Prepared = True的原因。 (5)我修复了On Error Resume Next代码(我认为)。和, (6)我尝试了不同的方法来向CommandText对象添加参数。没有完成SQL语句中指定的实际列(followup_Care_Need_Room)更新。应用程序的代码通过w / o错误运行,但不更新特定列。我怀疑是没有定义.CommandText对象。 (7)以下是我最近更新DB列的尝试。 -

Set cmd = Server.CreateObject("ADODB.Command")
With cmd .ActiveConnection = dbConn 
.CommandText = "UPDATE myTable SET [followup_Care_Need_Room] = ? WHERE entry_ID = 1379" 
.CommandType = adCmdText    
.Parameters(0) = Request("followupCareNeedRoom").Item 
End With 
set oRSQ = cmd.Execute   

请原谅我的评论的菜鸟使用/格式化。 -

在应用程序中声明的常量...
    ' ---- SQL注入     Const adCmdText = 1'评估为文本定义     Const adCmdStoredProc = 4'评估为存储过程     Const adParamInput = 1     Const adLongVarChar = 201     Const adVarChar = 200

我尝试了以下方法,但它没有更新指定的DB列......     .Parameters.Append .CreateParameter(" @ followupCareNeedRoom",adLongVarChar,adParamInput,1200,& Request(" followupCareNeedRoom")。Item)

问题解决了!

@AlexK提供了解决方案的关键,说我需要更改"?"在SQL语句中要更新的列的名称/ id。 一旦我做了那个改变,然后使用.Parameters.Append .CreateParameter(" @ followupCareNeedRoom",adLongVarChar,adParamInput,1200,& Request(" followupCareNeedRoom")。Item)声明,代码运行并DID更新followupCareNeedRoom字段。

原来我并没有完全理解"?"在SQL语句和.Parameters .Append..etc。

中的参数设置中

感谢@AlexK !!

**更新发布于2016年9月27日**

在这段代码上花了几天之后,我终于想出了一个解决方案。它工作一致且简单。它也确实使用"?"在SQL查询文本中 - 我并不完全清楚。我使用了其他人的建议,他们提供了反馈,将工作解决方案整合在一起。

顺便说一句,代码的目的是能够有选择地更新Web表单中每个用户输入的表行中的特定列。

以下是工作代码:

Dim cmd,strSQL,oRSQ 
set cmd = server.CreateObject("adodb.command")
cmd.Activeconnection= dbConn
cmd.CommandText = "UPDATE myTable SET care_Need_Description = ?, followup_Description = ?, followup_Care_Need_Room = ? WHERE entry_ID = '" & field17 & "'"
cmd.CommandType = adCmdText
cmd.Parameters.Append cmd.CreateParameter("@careNeedDescription", adLongVarChar, adParamInput, 1200, Request("careNeedDescription").Item)
cmd.Parameters.Append cmd.CreateParameter("@followupDescription", adLongVarChar, adParamInput, 1200, Request("followupDescription").Item)
cmd.Parameters.Append cmd.CreateParameter("@followupCareNeedRoom", adVarChar, adParamInput, 45, Request("followupCareNeedRoom").Item)
cmd("@careNeedDescription") = Request("careNeedDescription").Item
cmd("@followupDescription") = Request("followupDescription").Item
cmd("@followupCareNeedRoom") = Request("followupCareNeedRoom").Item
cmd.execute
' field17 contains the record id for the specific row that is to be updated.

感谢大家的反馈。

最后评论......

这里的首要目标是通过结合参数化查询来帮助防止SQL(查询,插入,更新)语句中的SQL注入。这种方法并不是预防的最终方法,而是黑客防止SQL注入的手段之一。

0 个答案:

没有答案