变量传递到存储过程与传统的ASP
好了,所以我想从一个传统的ASP页面某些字符串变量传递给MSSQL2000 DB正是如此:变量传递到存储过程与传统的ASP
strSQL = "exec UpdateEvent " & xID & ",'" & xEventID & "'," & xEventDisplayName & "," & xEventType & "," & xEventStatus & "," & xStartDate & "," & xEndDate & "," & xSurveyTemplateID & ""
然而,我最终的误差(包括写出在STRSQL内容):
EXEC UpdateEvent 1, '1-44KTDL' ,,,,,,
Microsoft OLE DB提供了SQL 服务器错误 '80040E14'
第1行:','附近语法不正确。
/eventedit.asp,线225
现在,我不知道这是否是在导致我的问题(为什么所有其他变量都上来与当空值的事件ID变量破折号那里有数据......)。我已经尝试了很多很多引用和抽动的组合来安抚语法解释器,但无济于事。我究竟做错了什么?有没有更好的方式来做这个简单的存储过程调用?
这非常糟糕;您的代码受SQL注入攻击,需要尽快修复。
<!--#include virtual="/ASPSAMP/SAMPLES/ADOVBS.INC"-->
<%
Set cmd = Server.CreateObject("ADODB.Command")
' ... open connection and stuff ... '
cmd.CommandText = "UpdateEvent"
cmd.CommandType = adCmdStoredProc
cmd.Parameters.Refresh
cmd.Parameters(1) = xID
cmd.Parameters(2) = xEventID
cmd.Parameters(3) = xEventDisplayName
cmd.Parameters(4) = xEventType
cmd.Parameters(5) = xEventStatus
cmd.Parameters(6) = xStartDate
cmd.Parameters(7) = xEndDate
cmd.Parameters(8) = xSurveyTemplateID
cmd.Execute
%>
@Rubens Farias:只是为了让我知道:为什么上面的代码比原来的更具鲁棒性?这样的SQL注入攻击是如何完成的? – Edelcom 2009-12-29 16:26:16
'xID =“; exec drop table tablename; - ”''这会做到这一点; http://www.securiteam.com/securityreviews/5DP0N1P76E.html – 2009-12-29 16:38:38
如果这些变量没有数据存在,您至少需要在其中放置NULL,否则SQL将失败。
例如,如果你粘贴
exec UpdateEvent 1,'1-44KTDL',,,,,,
直接进入查询分析器,你会得到同样的错误。
理想情况下,您需要将它们加载到参数数组中,并为每个参数(例如NULL)创建默认值,以防数据不存在。
这将确保您的存储过程正确构建。
例如
exec UpdateEvent 1,'1-44KTDL', NULL, NULL, NULL, NULL, NULL, NULL
我建议你捕捉你的代码 - >运行的是手动SQL数据库中正在生成的SQL>看你是否能发现问题。
在你的代码中填充strSQL的地方设置一个断点。跳过那条线。在那个时候获得strSQL的价值。
这可能会帮助您识别问题,这可能在您的语法中或可能由参数变量中的意外值引起。
是否所有变量都具有值,例如* xEventDisplayName *以及为什么不向其添加引号*,'“&xEventDisplayName&”',*。你的程序是否有默认值? – 2009-12-29 13:50:10