查找安全漏洞 - 真正的 SQL 注入还是误报?

Posted

技术标签:

【中文标题】查找安全漏洞 - 真正的 SQL 注入还是误报?【英文标题】:Find Security Bugs - Real SQL injection or false positive? 【发布时间】:2013-04-20 10:27:31 【问题描述】:

我正在使用FindBug 和插件Find Security Bugs 来帮助我找到代码中的安全漏洞。我不确定为什么某些代码被标记为易受 SQL 注入攻击。

这里有两个例子:

final StringBuilder queryString = new StringBuilder("SELECT users.login FROM Users users, Table table WHERE users.idUser = table.users.idUser");
Query query = session.createQuery(queryString.toString()); // This line is flagged


StringBuilder queryString = new StringBuilder("SELECT data FROM Table ");
queryString.append("WHERE table.idEntreprise = :id");
Query query = session.createQuery(queryString.toString()).setInteger("id", id); // This line is flagged

这是误报还是我错过了什么?如果我理解正确的话,使用createQuery()setX() 就足够了?

【问题讨论】:

我想,理论上,因为它是 StringBuilder 而不是字符串常量,所以有人可能会更改 SQL 字符串,但这似乎不太可能。 有必要把它做成StringBuilder吗?从这里的简短示例中,我看不出使字符串可变的任何意义。 @Zutty 是的,这似乎很难做到。 【参考方案1】:

这是误报。命名查询参数被 Hibernate 转义,因此不能执行 SQL 注入。

即使是没有命名参数的第一个查询也是安全的,因为它不使用外部输入作为 users.idUser 参数。

【讨论】:

以上是关于查找安全漏洞 - 真正的 SQL 注入还是误报?的主要内容,如果未能解决你的问题,请参考以下文章

Bitninja 是不是有 sql 注入误报?

信安小白,一篇博文讲明白暴力破解和SQL注入

我的手机说安全码不对?

OWASP ZAP - 如何“证明”误报?

Web安全篇之SQL注入攻击

Web安全篇之SQL注入攻击