【发布时间】:2010-09-28 17:32:01
【问题描述】:
我刚刚为 Eclipse 安装了 FindBugs 插件,希望它能帮助我找到代码中的 SQL 注入漏洞。然而,它似乎并没有找到任何东西,即使我故意放了一些。
在以下示例中,假设 staticFinalBaseQuery 声明如下:
public static final String staticFinalBaseQuery = "SELECT foo FROM table where id = '";
并假设 userInputfilterString 是包装示例 sn-ps 的方法的参数。它直接来自用户输入,没有经过处理。
例如,下面的 sn -p 不会触发警告:
String query = staticFinalBaseQuery + userInputfilterString;
pstmt = dbConnection.prepareStatement(query);
其中staticFinalBaseQuery 是一个静态的最终字符串,userInputfilterString 是一个直接来自用户输入的字符串,仅在运行时可用,根本不会被清除。显然,这是一个漏洞。
我预计会触发“A prepared statement is generated from a nonconstant String”警告。
以下 sn-p 也不会引起警告(并不奇怪,因为它们的编译形式可能相同):
pstmt = dbConnection.prepareStatement(staticFinalBaseQuery + userInputfilterString);
但是,这会导致警告:
pstmt = dbConnection.prepareStatement(staticFinalBaseQuery + userInputfilterString + "'");
如果我附加一个空字符串或一个空格,则不会触发任何警告。
那么,我的问题是,如何让 FindBugs 在我的第一个示例中触发?我也很好奇为什么第一个不会引起警告,但最后一个会?
提前致谢!
编辑:我submitted a bug 到 FindBugs 的错误跟踪系统,看来这可能是一个错误。但是,如果有人有任何提示,我很乐意听到。
【问题讨论】:
-
也许您应该将此作为错误报告给 FindBugs 的人?
-
是的,也许我应该这样做。我想也许我只是用错了。如果是这种情况,他们可能想要更新文档。
-
你能发布一下 staticFinalBaseQuery 和 userInputfilterString 是如何初始化的吗?
-
@Juha,我刚刚编辑了问题以显示这些论点的来源。
标签: java sql-injection findbugs