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

时间:2017-04-17 06:38:33

标签: java hibernate

我正在使用 Struts2 框架和 Hibernate ,我正在增强一个我没有开始的系统,我增强了系统的一些功能并在刺激。但是当他们使用Acunetix,登录模块中的某个位置扫描它时,系统中会检测到一些威胁(警报),其中警报显示:

  

提醒:SQL注入

     

严重程度:高

     

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

     

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

然后,我检查了脚本,这将是该警报的错误。 Old Developer使用Hibernate创建查询。

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

我的问题是:

- 使用Hibernate这个查询是不是可以避免SQL注入?

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

或以上都没有?

感谢您的时间。

1 个答案:

答案 0 :(得分:4)

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

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

这是常用的方法。

setStringsetParameter的非通用链接。 setParameter会自动检测数据类型。

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

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

通过这种方式,您将来不会遇到更多参数问题。