我正在做一些清理,以防止在使用ASP的旧内部网站中发生SQL注入攻击。以下是代码中所有内容的要点......
数据库连接在名为connect.asp
的单独asp文件中设置<%
on error resume next
Set DB = Server.CreateObject("ADODB.Connection")
DB.CommandTimeout = 180
DB.ConnectionTimeout = 180
connStr = "Provider=SQLOLEDB;Data Source=xxx-xxxx-xxxxxx;Initial Catalog=xxxx;Persist Security Info=True;User ID=xxxxx;Password=xxxxxxxxxxxx;"
DB.Open connStr
' Check DB connection and go to Error Handler is error exists
if DB.state=0 then
Response.Write "<p>Cannot connect to database.</p>"
TrapError Err.description
Response.end
end if
%>
这样可以打开数据库连接。
我有一个名为DBFunctions.asp的文件,用于将映射函数排序到存储过程及其参数。我正在尝试使用下面的函数将ADO记录集返回到另一个asp前端页面。
Function GetFacilityByFID(fid)
set rs = server.CreateObject("ADODB.Recordset")
Set cmd = Server.CreateObject("ADODB.Command")
Set cmd.ActiveConnection = DB
cmd.CommandText = "GetFacilityByFID"
cmd.CommandType = adCmdStoredProc
cmd.Parameters.Append cmd.CreateParameter("@FID", adVarChar, adParamInput, 20)
cmd("@FID") = fid
Set rs = cmd.Execute
Set GetFacilityByFID = rs
End Function
以下是来自调用前端asp页面的代码,facDetail.asp
<%
Dim FID, FCBI, Error
FID = Request("FID")
FCBI = Request("FCBI")
' Check DB connection and go to Error Handler is error exists
if DB.state=0 then
Response.Write "<p>Cannot connect to database.</p>"
TrapError Err.description
Response.end
else
if FID then
Set RS = GetFacilityByFID(FID)
elseif FCBI then
Set RS = GetFacilityByFCBI(FCBI)
end if
if RS.EOF then
Response.Write "<BR><p class=alert>No record found</p>"
response.End
end if
end if
%>
调用页面显示没有返回记录
但存储过程在SSMS中执行时有效。
更新了代码
这是GetFacilityByFID存储过程的SQL代码。
CREATE PROCEDURE [dbo].[GetFacilityByFID]
@FID varchar(20)
AS
BEGIN
SET NOCOUNT ON;
SELECT [FAC_CBI_NBR]
,[FAC_ID]
,[FAC_TYPE]
,[FAC_SUBTYPE]
,[FAC_REGION]
,[FAC_COST_CENTER]
,[FAC_SUPPLY_CODE]
,[FAC_UPLINE]
,[FAC_SERVICE]
,[FAC_LOCATION_NAME]
,[FAC_LOCAL_ADDR1]
,[FAC_LOCAL_ADDR2]
,[FAC_LOCAL_CITY]
,[FAC_LOCAL_STATE]
,[FAC_LOCAL_ZIP]
,[FAC_MAIL_ADDR1]
,[FAC_MAIL_ADDR2]
,[FAC_MAIL_CITY]
,[FAC_MAIL_STATE]
,[FAC_MAIL_ZIP]
,[FAC_COUNTRY]
,[FAC_PHONE]
,[FAC_FAX]
,[FAC_MANAGER]
,[FAC_CONTACT]
,[FAC_CONTACT_PHONE]
,[FAC_CONTACT_EXT]
,[FAC_CONTACT_EMAIL]
,[FAC_COMMENTS]
,[FAC_CHANGED_BY]
,[FAC_LAST_UPDATE]
,[FAC_MAILOUT]
,[FAC_CONTRACTION]
,[FAC_PROPERTY_CODE]
,[FAC_ATTN_TO]
FROM [cbid].[dbo].[FACILITY]
WHERE [FAC_ID]=@FID
END
GO
谁能告诉我出了什么问题?我一直在看这个问题,并且对此感到沮丧。
任何帮助将不胜感激!
修改:
当前问题状态:从ADO提供商处获取以下信息
错误号:-2147217904错误描述:过程或函数'GetFacilityByFID'需要参数'@FID',这是未提供的。错误源:用于SQL Server的Microsoft OLE DB提供程序
答案 0 :(得分:1)
您需要指定尺寸。
来自CreateParameter Method (ADO)
如果在 Type 参数中指定可变长度数据类型,则为 必须传递 Size 参数或设置 Size 参数对象的属性,然后将其附加到 参数集合;否则会发生错误。
cmd.Parameters.Append cmd.CreateParameter("@FID", adVarChar, adParamInput, Len(fid))
答案 1 :(得分:0)
在继续之前,首先要确认您的存储过程GetFacilityByFID是否实际返回Recordset?很可能它没有。如果它只返回单个字符串值,则应将Function GetFacilityByFID(fid)
修改为如下所示:
Function GetFacilityByFID(fid)
Set cmd = Server.CreateObject("ADODB.Command")
Set cmd.ActiveConnection = DB
cmd.CommandText = "GetFacilityByFID"
cmd.CommandType = adCmdStoredProc
cmd.Parameters.Append cmd.CreateParameter("@returnVal", adVarChar, adParamOutput, 255, "")
cmd.Parameters.Append cmd.CreateParameter("@FID", adVarChar, adParamInput)
cmd("@FID") = fid
cmd.Execute
GetFacilityByFID = cmd("@returnVal")
End Function
答案 2 :(得分:0)
我使用我发现的一些例子和一些LankyMart的建议重写了这个函数。谢谢大家的帮助。
这是工作代码......
Function GetFacilityByFID(fid)
Set rs = server.CreateObject("ADODB.Recordset")
Set cmd = Server.CreateObject("ADODB.Command")
Set cmd.ActiveConnection = DB
cmd.CommandText = "GetFacilityByFID"
cmd.CommandType = adCmdStoredProc
cmd.CommandTimeout = 900
set prm = cmd.CreateParameter("@FID",adVarChar, adParamInput, 20, fid)
cmd.Parameters.Append prm
rs.CursorLocation = adUseClient
rs.Open cmd, , adOpenForwardOnly, adLockReadOnly
Set GetFacilityByFID = rs
On Error GoTo 0
End Function
答案 3 :(得分:-1)
您设置参数的方式看起来不对,请尝试这样做:
Dim param
Set param = cmd.CreateParameter("@FID", adVarChar, adParamInput)
cmd.Parameters.Append param
param.Value = fid
您可以在此处阅读更多内容:https://msdn.microsoft.com/pt-br/library/ms675860(v=vs.85).aspx
希望有所帮助