【问题标题】:Passing variables to stored procedure with Classic ASP使用经典 ASP 将变量传递给存储过程
【发布时间】:2009-12-29 13:41:24
【问题描述】:

好的,所以我正在尝试将一些字符串变量从经典 ASP 页面传递到 MSSQL2000 数据库:

strSQL = "exec UpdateEvent " & xID & ",'" & xEventID & "'," & xEventDisplayName & "," & xEventType & "," & xEventStatus & "," & xStartDate & "," & xEndDate & "," & xSurveyTemplateID & ""

但我最终得到了错误(包括写出 strSQL 内容):

exec UpdateEvent 1,'1-44KTDL',,,,,,

用于 SQL 的 Microsoft OLE DB 提供程序 服务器错误“80040e14”

第 1 行:',' 附近的语法不正确。

/eventedit.asp,第 225 行

现在我不确定是否是 EventID 变量中的破折号导致了我的问题(或者为什么当有数据时所有其他变量都出现空值......)。我尝试了许多引号和抽动的组合来安抚语法解释器,但无济于事。我究竟做错了什么?有没有更好的方法来做这个简单的存储过程调用?

【问题讨论】:

  • 所有变量是否都有值,例如 xEventDisplayName 以及为什么不为其添加引号 ,'" & xEventDisplayName & "', 。你的程序有默认值吗?

标签: sql stored-procedures asp-classic


【解决方案1】:

这非常非常糟糕;您的代码受到 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
%>

【讨论】:

  • @Rubens Farias:让我知道:为什么上面的代码比原始代码更健壮。这样的SQL注入攻击是如何实现的?
  • xID = "; exec drop table tablename; --" ' 这样就可以了; securiteam.com/securityreviews/5DP0N1P76E.html
【解决方案2】:

如果这些变量不存在数据,您至少需要在其中放置 NULL,否则 SQL 将失败。

例如,如果您粘贴

exec UpdateEvent 1,'1-44KTDL',,,,,, 

直接进入查询分析器,你会得到同样的错误。

理想情况下,您需要将它们加载到参数数组中,并为每个参数创建默认值(例如 NULL),以防没有数据存在。

这将确保您的存储过程正确构建。

例如

 exec UpdateEvent 1,'1-44KTDL', NULL, NULL, NULL, NULL, NULL, NULL

【讨论】:

    【解决方案3】:

    【讨论】:

      【解决方案4】:

      我建议您捕获代码中生成的 SQL > 在数据库中手动运行该 SQL > 看看是否能发现问题。

      在填充 strSQL 的代码中设置断点。越过那条线。获取此时 strSQL 的值。

      这可能会帮助您识别问题,这可能在您的语法中,也可能由参数变量中的意外值引起。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-02
        • 2011-09-15
        • 1970-01-01
        • 2014-11-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多