MS SQL Server存储过程错误'语法不正确'

时间:2009-08-19 02:13:51

标签: sql asp-classic ado

这是我的存储过程:

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

但每次我运行它时都会收到以下错误消息:

错误讯息:

错误类型: 用于SQL Server的Microsoft OLE DB提供程序(0x80040E14) 第1行:'.0'附近的语法不正确。 /etearsheets/authorize/CheckAccess.asp,第1163行

导致'.0'错误的IP格式有什么问题?如何更正?

谢谢R。

3 个答案:

答案 0 :(得分:2)

您没有为varchar列添加报价。

试试这个:

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

IP地址失败,因为127.0.0.1不是数字。您当前正尝试将其作为float传递,它只使用一个小数。用单引号括起来强制SQL将其解析为字符串。

答案 1 :(得分:1)

您需要在ClientIP值周围加上单引号。

答案 2 :(得分: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', 'XYZ'

您可以通过将SQLEncode和BuildSQL放入他们自己的文件DataAccess.inc并使用include语句在所有ASP文件中使用它来更进一步。

e.g。

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

为此,您需要在IIS中启用服务器端包含,并确保#include语句中的相对路径正确。