Findbugs 没有发现潜在的 SQL 注入漏洞
Posted
技术标签:
【中文标题】Findbugs 没有发现潜在的 SQL 注入漏洞【英文标题】:Findbugs not finding potential SQL injection vulnerability 【发布时间】: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,我刚刚编辑了问题以显示这些论点的来源。 【参考方案1】:这里很难区分安全代码和不安全代码。当然,userInputfilterString 可能是不安全的,但在编译时不可能确定这一点。但是,字符串连接中的单引号字符是使用可注入代码的标志。这就是为什么 FindBugs 在包含此字符的行上触发,而不是在仅字符串连接的行上触发。
基本上,这不是错误,而是软件可以检查 SQL 注入的能力的限制。由于字符串可能包含 anything(即它可能在另一个函数中存在易受攻击的连接),因此无法让该工具确定存在问题。
【讨论】:
我刚刚编辑了问题以说明我希望 FindBugs 触发哪个检查,以及为什么我认为它应该将我的 sn-ps 显示为可能的错误。 我基本同意这个答案,但是在调用preparetament时肯定会发生非常量的连接,所以我也希望触发检查。【参考方案2】:我认为PMD 或Checkstyle 也不会捕捉到它,但你可以尝试一下(我经常使用所有 3 个,很好用的工具)。
编辑:PMD 是正确的链接,但我称它为 findbugs... findbugs on the brain 我猜...
【讨论】:
【参考方案3】:考虑升级到商业软件,例如 http://www.ouncelabs.com/,这将更好地服务于您的目的......
【讨论】:
以上是关于Findbugs 没有发现潜在的 SQL 注入漏洞的主要内容,如果未能解决你的问题,请参考以下文章