pka*_*ing 5 java sql-injection findbugs
我刚安装了Eclipse的FindBugs插件,希望它能帮助我在代码中找到SQL注入漏洞.然而,它似乎没有找到任何东西,即使我故意放入一些.
在以下示例中,假设staticFinalBaseQuery
声明如下:
public static final String staticFinalBaseQuery ="SELECT foo FROM table where id ='";
并假设userInputfilterString
是包装示例代码段的方法的参数.它直接来自用户输入,并且没有消毒.
例如,以下代码段不会触发警告:
String query = staticFinalBaseQuery + userInputfilterString;
pstmt = dbConnection.prepareStatement(query);
Run Code Online (Sandbox Code Playgroud)
staticFinalBaseQuery
静态最终字符串在哪里,并且userInputfilterString
是直接来自用户输入的字符串,仅在运行时可用,根本不擦除.显然,这是一个漏洞.
我希望触发" 准备好的语句是从非常量String生成的 "警告.
以下代码段也不会引发警告(这并不奇怪,因为这些代码的编译形式可能相同):
pstmt = dbConnection.prepareStatement(staticFinalBaseQuery + userInputfilterString);
Run Code Online (Sandbox Code Playgroud)
但是,这会引起警告:
pstmt = dbConnection.prepareStatement(staticFinalBaseQuery + userInputfilterString + "'");
Run Code Online (Sandbox Code Playgroud)
如果我追加空字符串或空格,则不会触发警告.
所以,我的问题是,如何让我的第一个例子触发FindBugs?我也好奇为什么第一个不会引起警告,但最后一个呢?
提前致谢!
编辑:我向 FindBugs的bug跟踪系统提交了一个错误,因为它似乎可能是一个错误.但是,如果有人有任何提示,我很乐意听到他们的意见.
这里很难区分安全代码和不安全代码。当然,userInputfilterString可能不安全,但在编译时无法确定这一点。然而,字符串连接中的单引号字符是使用可注入代码的明显标志。这就是为什么 FindBugs 在包含该字符的行上触发,但不在仅包含字符串连接的行上触发。
基本上,这不是一个错误,而是软件检查 SQL 注入的能力的限制。由于该字符串可能包含任何内容(即它可能在另一个函数中具有易受攻击的连接),因此不可能让该工具确定存在问题。