2009-08-19 86 views
1

這是我的存儲過程:MS SQL Server存儲過程錯誤「不正確的語法」

ALTER PROCEDURE its.sp_WriteTransaction 

    (
    @LoginID int, 
    @PersonID int, 
    @BusinessID int, 
    @TransType smallint, 
    @LastHost varchar(15), 
    @TransData varchar(255) 
) 

AS 

DECLARE @TransDate DATETIME 
SET @TransDate = GETDATE() 

INSERT INTO Transactions (LoginID, PersonID, BusinessID, TransDate, TransType, LastHost, TransData) 
VALUES (@LoginID, @PersonID, @BusinessID, @TransDate, @TransType, @LastHost, @TransData) 
RETURN 

這是我的電話線:

sql = "sp_WriteTransaction" & " " & Session("UserID") & "," & Session("PersonID") & "," & Session("bizID") & "," & TransType & "," & ClientIP & "," & TransData 

但每次我運行它,我得到以下錯誤信息:

錯誤消息:

錯誤類型: 微軟OLE SQL Server的數據庫提供程序(0x80040E14) 第1行:「.0」附近的語法不正確。 /etearsheets/authorize/CheckAccess.asp,line 1163

導致'.0'錯誤的IP格式有什麼問題,我該如何糾正它?

感謝R.

+1

**不要一直使用**使用「sp_」作爲存儲的參數名稱前綴!如果你這樣做的話,微軟很生氣!這是一個微軟保留的前綴,如果你真的使用它,你只是要求麻煩!使用「proc_」或別的東西 - 或根本沒有前綴。 – 2009-08-19 05:11:28

+0

實際上我沒有選擇,我正在根據公司文檔構建這些存儲過程,並且'sp_'問題與SQL Server 7.0 Service Pack 4有關,我們在V.09.00.3042上。不過謝謝你的提升,我會記住。 – flavour404 2009-08-19 19:50:43

+0

此代碼易受sql注入影響 – 2011-12-01 19:42:29

回答

2

您還沒有包括報價爲您varchar列。

試試這個:

sql = "sp_WriteTransaction" & " " & Session("UserID") & "," & _ 
    Session("PersonID") & "," & Session("bizID") & "," & _ 
    TransType & ",'" & ClientIP & "','" & TransData & "'" 

它的失敗了的IP地址,因爲127.0.0.1不是數字。您目前正在嘗試將其作爲浮點數傳遞,該浮點數只使用一位小數。將其包含在單引號中會強制SQL將其解析爲字符串。

+5

雖然正確,但我不能爲此投票,因爲它不使用查詢參數,因此可能容易受到注入攻擊。大部分這些值可能會讓你失望,但TransData從哪裏來? – 2009-08-19 03:18:48

+1

@Joel:我沒有進入SQL注入式談話,因爲這看起來都是系統數據,但你確實提出了一個很好的觀點。 – Eric 2009-08-19 03:25:05

+0

好的你是對的,大部分使用的數據都是系統數據。此外,是的,我知道系統中存在安全漏洞,我已經告訴客戶,但他們似乎不願意聽b)不想付錢來分類,所以我嘗試「適合」事情當我遇到他們但除此之外,我被支付給'使其工作',雖然我有時只是知道會發生什麼事而畏縮。 – flavour404 2009-08-19 19:40:57

1

您需要在ClientIP值附近放置單引號。

1

像其他人說的,你不是單引號參數。

假設...

Session("UserID") = 0000 
Session("PersonID") = 4321 
Session("bizID") = 1234 
TransType = "GET" 
ClientIP = "192.168.1.1" 
TransData = "xyz" 

然後執行以下操作...

sql = "sp_WriteTransaction" & " " & Session("UserID") & "," & Session("PersonID") & "," & Session("bizID") & "," & TransType & "," & ClientIP & "," & TransData 
response.write(sql) 

會產生...

sp_WriteTransaction 0,4321,1234,GET, 192.168.1.1,xyz

更麻煩的是您將未編碼的字符串傳遞給SQL,因爲這會讓您容易受到SQL注入攻擊。在這種情況下,它看起來像數據可能都來源於沒有客戶來源,但考慮到你的問題的性質/天真,我懷疑你可能在其他地方是脆弱的。

這裏是如何保護您的SQL

Session("UserID") = 11111 
Session("PersonID") = 4321 
Session("bizID") = 1234 
TransType = "GET" 
ClientIP = "192.168.1.1" 
TransData = "xyz" 

sql = "sp_WriteTransaction {0},{1},{2},{3},{4},{5}" 
parameters = Array(Session("UserID"),Session("PersonID"),Session("bizID"),TransType,ClientIP,TransData) 

Function BuildSQL(query, params) 
    Dim result : result = query 

    If Not IsArray(params) Then 
     BuildSQL = Null 
     Exit Function 
    End If 

    Dim i 
    For i = lbound(params) to ubound(params) 
     result = replace(result,"{" & i & "}",SQLEncode(params(i))) 
    Next 

    BuildSQL = result 
End Function 

Function SQLEncode (uVar) 
    If IsNull(uVar) Then 
     SQLEncode = "null" 
    Else 
     SQLEncode = "'" & replace(uVar,"'","''") & "'" 
    End If 
End Function 

Response.Write BuildSQL("sp_WriteTransaction {0},{1},{2},{3},{4},{5}",parameters) 

此代碼輸出下面的一個例子...

sp_WriteTransaction '11111', '4321', '1234',」 GET '' 192.168.1。1' ,‘某某’

你可以採取這種通過把SQLEncode和BuildSQL到他們自己的文件DataAccess.inc並使其可在您所有的ASP文件與包括聲明更進了一步。

例如

<!-- #include file="DataAccess.inc"--> 

要做到這一點,你需要有服務器端包含在IIS中啓用,並確保在#include語句的相對路徑是正確的。

+0

使用參數化SQL會更安全,更容易,而不是試圖自己編碼字段。 – LukeH 2009-08-19 08:51:14

+0

@Luke:我不知道你可以在Classic ASP中做參數化的SQL。 – MyItchyChin 2009-08-19 12:39:56

+1

@CptSkippy:你可以做到。看看http://msdn.microsoft.com/en-us/library/ms675101(VS.85).aspx – LukeH 2009-08-19 21:46:03