我刚刚为 Eclipse 安装了 FindBugs 插件,希望它能帮助我找到代码中的 SQL 注入漏洞。然而,它似乎并没有找到任何东西,即使我故意放了一些。
在以下示例中,假设staticFinalBaseQuery
声明如下:
public static final String staticFinalBaseQuery = "SELECT foo FROM table where id = '";
并且假设userInputfilterString
是包装示例片段的方法的参数。它直接来自用户输入,没有经过净化。
例如,以下代码段不会触发警告:
String query = staticFinalBaseQuery + userInputfilterString;
pstmt = dbConnection.prepareStatement(query);
wherestaticFinalBaseQuery
是一个静态的最终字符串,userInputfilterString
是直接来自用户输入的字符串,仅在运行时可用,根本不被清除。显然,这是一个漏洞。
我希望触发“ Aprepared statement is generated from a nonconstant String ”警告。
以下代码段也不会引起警告(不足为奇,因为它们的编译形式可能相同):
pstmt = dbConnection.prepareStatement(staticFinalBaseQuery + userInputfilterString);
但是,这将导致警告:
pstmt = dbConnection.prepareStatement(staticFinalBaseQuery + userInputfilterString + "'");
如果我附加一个空字符串或一个空格,则不会触发任何警告。
所以,我的问题是,如何让 FindBugs 在我的第一个示例中触发?我也很好奇为什么第一个不会引起警告,但最后一个呢?
提前致谢!
编辑:我向 FindBugs 的错误跟踪系统提交了一个错误,因为这似乎是一个错误。但是,如果有人有任何提示,我很想听听。