Stored procedures SQL注入-存储过程调用没有危险(在iSeries上)?

Stored procedures SQL注入-存储过程调用没有危险(在iSeries上)?,stored-procedures,xss,sql-injection,ibm-midrange,rpgle,Stored Procedures,Xss,Sql Injection,Ibm Midrange,Rpgle,我已经做了一些搜索,但我有一个关于SQL注入的具体问题,希望我能得到一些输入,因为我相信我可能在现场数据清理等方面得到了错误的结果:- 我有一个java程序在iSeries上调用存储过程。存储过程在幕后有CL/RPG代码。存储过程通过参数调用,数据来自网页。例如,调用将如下所示:- call library.prog('field1Value', 'field2Value') 我是否需要担心通过网站输入到“field1Value”等中的任何字符,或者因为这是一个存储过程调用,sql注入的危险是

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

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

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

传递到proecdure中的字段长度是固定长度的,因此我们不能(例如)将“dodgy”字符转换为它们的html等效字符


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

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

除非您使用这些参数在过程本身中构造动态SQL,否则应该可以

此外,您无法通过检查参数来清理它

请看这里:

下面是sql server语法

我可以这样调用proc

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)'
还是像这样

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)'

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

只是为了澄清-我们使用的是JDBC CallableStatement如果我发现proc正在使用一个或多个字段值构造一些动态SQL,我假设proc应该负责“清理”数据,以确保不可能进行SQL注入?有什么关于如何工作的指导吗?你不能清理它,请参阅中的链接answer@SQLMenace问题是关于IBMMidRange,这意味着DB2fori,而不是SQLServer。您关于“尝试保护此”的链接不相关,我看不出iSeries上的过程无法清除其输入参数的原因。这些参数是经过类型检查的,只要您在存储过程中没有执行
准备
执行
执行中间
,您就安全了。如果使用参数标记,即使是
prepare
execute
也可以是安全的。我认为关键是,您必须编写一个完整的解析器,以便能够清理用户编写的语句,并且该解析器必须比内置的SQL解析器具有更多的智能,因为它不仅必须理解语言,而且还必须理解可能被恶意使用的所有方式。那将是一个非常繁重的程序。