Hibernate的Query.setParameter方法是否会导致SQL注入的问题?

4
我正在使用 Struts2 框架和 Hibernate,我正在增强一个我没有开始的系统,我增强了一些系统功能并在生产环境中实施。但是当他们使用 Acunetix 进行扫描时,在登录模块的某个地方,系统检测到了一些威胁(警报),其中警报显示:

警报:SQL注入

严重性:高

描述:此脚本可能容易受到 SQL 注入攻击。

建议:您的脚本应该过滤用户输入中的元字符。有关修复此漏洞的详细信息,请查看详细信息。

然后,我检查了导致该警报的脚本。旧开发人员使用 Hibernate 创建查询。

List<UserBean> users = session.createQuery("from UserBean where username =?")
    .setParameter(0,username)
    .list();

我的问题是:

-使用Hibernate的这个查询是否无法避免SQL注入?

-应该使用.setString而不是.setParameter来更具体地避免SQL注入吗?

还是以上都不是?

感谢您的时间。

1个回答

7
如果您使用Hibernate查询参数绑定,就可以避免SQL注入攻击。
与字符串拼接相反,setParameter会在创建准备好的语句并执行查询之前填充查询的占位符,查询处理引擎知道应该转义哪些(可能是恶意的)字符。
这是常见的方法。
setString是setParameter的非泛型对应项。setParameter会自动检测数据类型。
一个小改进是使用命名参数绑定,例如:
List<UserBean> users = session.createQuery("from UserBean where username = :username")
.setParameter("username", username)
.list();

这样做可以避免在未来使用更多参数时出现更多问题。


1
这对我解释了很多,但为什么它会警告说它容易受到 SQL 注入攻击,即使我已经按名称绑定了它? - msagala25
我完全不了解Acunetix工具,你需要向这个领域的专家询问为什么报告会这样说。也许只是因为该工具没有找到任何验证输入的代码,并且它不知道Hibernate或准备语句的工作原理。 - Kevin Peters
为什么在 setParameter("username", username) 中不可能发生 SQL 注入?有人可以将恶意 SQL 作为用户名传递进来,那会发生什么? - Kumar Manish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接