2009-12-29 66 views
1

好了,所以我想从一个传统的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变量破折号那里有数据......)。我已经尝试了很多很多引用和抽动的组合来安抚语法解释器,但无济于事。我究竟做错了什么?有没有更好的方式来做这个简单的存储过程调用?

+0

是否所有变量都具有值,例如* xEventDisplayName *以及为什么不向其添加引号*,'“&xEventDisplayName&”',*。你的程序是否有默认值? – 2009-12-29 13:50:10

回答

5

这非常糟糕;您的代码受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 
%> 
+0

@Rubens Farias:只是为了让我知道:为什么上面的代码比原来的更具鲁棒性?这样的SQL注入攻击是如何完成的? – Edelcom 2009-12-29 16:26:16

+1

'xID =“; exec drop table tablename; - ”''这会做到这一点; http://www.securiteam.com/securityreviews/5DP0N1P76E.html – 2009-12-29 16:38:38

1

如果这些变量没有数据存在,您至少需要在其中放置NULL,否则SQL将失败。

例如,如果你粘贴

exec UpdateEvent 1,'1-44KTDL',,,,,, 

直接进入查询分析器,你会得到同样的错误。

理想情况下,您需要将它们加载到参数数组中,并为每个参数(例如NULL)创建默认值,以防数据不存在。

这将确保您的存储过程正确构建。

例如

exec UpdateEvent 1,'1-44KTDL', NULL, NULL, NULL, NULL, NULL, NULL 
0

我建议你捕捉你的代码 - >运行的是手动SQL数据库中正在生成的SQL>看你是否能发现问题。

在你的代码中填充strSQL的地方设置一个断点。跳过那条线。在那个时候获得strSQL的价值。

这可能会帮助您识别问题,这可能在您的语法中或可能由参数变量中的意外值引起。