5

我刚刚为 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 的错误跟踪系统提交了一个错误,因为这似乎是一个错误。但是,如果有人有任何提示,我很想听听。

4

3 回答 3

2

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

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

于 2008-12-29T21:00:57.523 回答
1

我认为PMDCheckstyle也不会捕捉到它,但你可以试一试(我定期使用所有 3 个,使用的好工具)。

编辑:PMD 是正确的链接,但我称它为 findbugs... findbugs on the brain 我猜...

于 2009-03-07T16:46:09.967 回答
0

考虑升级到商业软件,例如http://www.ouncelabs.com/,它将更好地服务于您的目的......

于 2009-04-18T00:49:17.823 回答