【问题标题】:SQL injection - no danger on stored procedure call (on iSeries)?SQL 注入 - 存储过程调用没有危险(在 iSeries 上)?
【发布时间】:2010-11-10 07:37:33
【问题描述】:

我已经进行了一些搜索,但我有一个关于 SQL 注入的具体问题,希望我能得到一些意见,因为我相信我可能在字段数据清理等方面得到了错误的结果:-

我有一个 java 程序调用 iSeries 上的存储过程。存储过程在幕后有 CL/RPG 代码。存储过程通过参数调用,数据来自网页。例如,调用如下所示:-

call library.prog('field1Value', 'field2Value')

我是否需要担心通过网站输入'field1Value'等的任何字符,或者因为它是一个存储过程调用,是否不存在sql注入的危险?这是否取决于幕后的 RPG 程序是否在其自己的 SQL 语句中使用“field1Value”作为该处理的一部分?

传递到过程中的字段长度是固定长度的,因此我们无法将“狡猾”字符转换为相应的 html 字符。

感谢任何(我预计这可能是一个愚蠢的问题!)对此的反馈(不一定是 iSeries 特定的)。

【问题讨论】:

  • 澄清一下 - 我们使用的是 JDBC CallableStatement

标签: stored-procedures xss sql-injection ibm-midrange rpgle


【解决方案1】:

如果您使用的是 JDBC CallableStatement,那么您是安全的。 CallableStatement 只是 PreparedStatement 的一个子类型,应该不可能进行 SQL 注入攻击。我能想到的唯一方法是,如果您的存储过程正在执行动态 SQL。

【讨论】:

    【解决方案2】:

    除非您使用这些参数在 proc 本身中构造动态 sql,否则应该没问题

    你也不能通过检查参数来清理它

    请看这里:SQL teaser..try protecting this

    下面是sql server语法

    我可以像这样调用一个过程

    prDropDeadFred ' declare @d varchar(100) select @d = reverse(''elbaTdaB,elbatecin elbat pord'') exec (@d)'
    

    或者像这样

    prDropDeadFred ' declare @d varchar(100) select @d = convert(varchar(100),0x64726F70207461626C65204E6963655461626C652C4261645461626C65) exec (@d)'
    

    或其他 5000 种你不知道的方式

    【讨论】:

    • 如果我发现 proc 正在使用一个或多个字段值构造一些动态 SQL,我假设 proc 应该负责“清理”数据以确保没有 SQL 注入是可能的?有没有关于这应该如何工作的指导?
    • 你无法清理它,请参阅答案中的链接
    • @SQLMenace 问题是关于 ibm-midrange,这意味着 DB2 for i,而不是 SQL Server。您的“尝试保护此”链接不相关,我看不出 iSeries 上的程序无法清除其输入参数的原因。
    • 这些参数经过类型检查,只要您不在存储过程中执行prepareexecuteexecuteimmediate,您就是安全的。如果您使用参数标记,即使 prepareexecute 也是安全的。我认为关键是您必须编写一个完整的解析器才能清理用户编写的语句,并且该解析器必须比内置的 SQL 解析器具有更多的智能,因为它不仅需要理解语言,还有所有可能被恶意使用的方式。那将是一个非常繁重的过程。
    【解决方案3】:

    如果被调用的程序使用输入参数来构造动态 SQL,将信息传递给执行此操作的另一个程序,或者将其存储在数据库表字段中,该字段稍后将用于其他程序中的动态 SQL,那么您可能不安全.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-06
      • 1970-01-01
      • 2013-05-03
      • 2014-02-28
      • 1970-01-01
      • 2023-04-07
      • 2011-10-24
      • 1970-01-01
      相关资源
      最近更新 更多