这是我的存储过程:
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。
答案 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语句中的相对路径正确。