我正在升级经典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注入的手段之一。