Hibernate的Query.setParameter是否使SQL注入成为可能



我正在使用Struts2框架和休眠,我正在增强一个我没有启动的系统,我增强了系统的一些功能并在产品上实现它。但是,当他们使用登录模块中的某个位置的Acunetix扫描它时,在系统中检测到一些威胁(警报),其中警报说:

警报:SQL 注入

严重性:高

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

建议:脚本应从用户输入中筛选元字符。查看详细信息以获取有关修复的更多信息 此漏洞。

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

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

我的问题是:

-这个使用休眠的查询不能避免SQL注入吗?

-是否应该.setString.setParameter更具体以避免SQL注入?

或以上都不是?

谢谢你的时间。

如果您像这样使用 Hibernate 查询参数绑定,则可以免受 SQL 注入攻击。

与字符串串联相反,setParameter将在创建预准备语句后和执行查询之前填充查询的占位符,并且查询处理引擎知道应转义哪些(可能是恶意的)字符。

这是常见的方法。

setStringsetParameter的非通用吊坠。setParameter自动检测数据类型。

一个小的改进是使用命名参数绑定,例如:

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

这样,您将来不会遇到更多参数的问题。

最新更新