2009-12-29 80 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的價值。

這可能會幫助您識別問題,這可能在您的語法中或可能由參數變量中的意外值引起。