我已经做了一些搜索,但我有一个关于SQL注入的具体问题,希望我可以得到一些输入,因为我相信我可能会得到错误的结束与字段数据清理等: -
我有一个java程序在iSeries上调用存储过程。存储过程在后台具有CL / RPG代码。通过参数调用存储过程,数据来自网页。例如,呼叫将如下所示: -
call library.prog('field1Value', 'field2Value')
我是否需要担心通过网站输入的任何字符到'field1Value'等,或者因为它是存储过程调用,是否存在sql注入的危险?是否取决于幕后的RPG程序是否在其自己的SQL语句中使用“field1Value”作为该处理的一部分?
传递给proecdure的字段长度是固定长度的,所以我们不能,例如,将'dodgy'字符转换为它们的html等价物。
欣赏任何(我预计这可能是一个愚蠢的问题!)反馈(不一定是iSeries特定的)。
答案 0 :(得分:1)
除非您使用这些参数在proc本身构建动态sql,否则你应该没问题
你也无法通过检查参数来清理它
见这里:SQL teaser..try protecting this
下面是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)'
或其他5000种您不了解的方式
答案 1 :(得分:1)
如果被调用的程序使用输入参数构造动态SQL,将信息传递给另一个执行的程序,或将其存储在数据库表字段中,稍后在某些其他程序中用于动态SQL,则可能不安全。
答案 2 :(得分:0)
如果您正在使用JDBC CallableStatement,那么您就是安全的。 CallableStatement只是PreparedStatement的子类型,不应该有SQL注入攻击。如果您的存储过程正在执行动态SQL,那么我能想到的唯一方法就是这样做。