Findbugs没有发现潜在的SQL注入漏洞

时间:2008-12-29 17:33:46

标签: 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);

其中staticFinalBaseQuery是静态最终字符串,userInputfilterString是直接来自用户输入的字符串,仅在运行时可用,根本不会被清除。显然,这是一个漏洞。

我希望触发“A prepared statement is generated from a nonconstant String”警告。

以下代码段也不会引起警告(这并不奇怪,因为这些代码的编译形式可能相同):

pstmt = dbConnection.prepareStatement(staticFinalBaseQuery + userInputfilterString);

然而,这会引起警告:

pstmt = dbConnection.prepareStatement(staticFinalBaseQuery + userInputfilterString + "'");

如果我追加空字符串或空格,则不会触发警告。

所以,我的问题是,我怎样才能在第一个例子中触发FindBugs?我也很好奇为什么第一个不会引起警告,但是最后一个呢?

提前致谢!

编辑:我submitted a bug到FindBugs的错误跟踪系统,因为它似乎可能是一个错误。但是,如果有人有任何提示,我很乐意听到。

3 个答案:

答案 0 :(得分:2)

这里很难区分安全代码和不安全代码。当然,userInputfilterString 可能不安全,但在编译时无法确定。但是,字符串连接中的单引号字符是使用可注入代码的标志。这就是为什么FindBugs在包含这个字符的行上触发,但不仅仅是字符串连接的行。

基本上,这不是一个错误,而是软件检查SQL注入可以做多少的限制。由于字符串可能包含任何(即它可能在另一个函数中具有易受攻击的连接),因此无法让工具确定存在问题。

答案 1 :(得分:1)

我认为PMDCheckstyle也不会抓住它,但你可以尝试一下(我会定期使用全部3个,使用好的工具)。

编辑:PMD是正确的链接,但我把它称为findbugs ...大脑中的findbugs我猜...

答案 2 :(得分:0)

考虑升级到商业软件,例如http://www.ouncelabs.com/,这将更好地满足您的目的......