我正在使用 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注入?
或以上都没有?
感谢您的时间。
答案 0 :(得分:4)
如果您使用这样的Hibernate查询参数绑定,则可以免受SQL注入攻击。
与字符串连接相反,setParameter
将在创建预准备语句之后和执行查询之前填充查询的占位符,并且查询处理引擎知道应该转义哪些(可能是恶意的)字符。 / p>
这是常用的方法。
setString
是setParameter
的非通用链接。 setParameter
会自动检测数据类型。
一个小的改进是使用命名参数绑定,例如:
List<UserBean> users = session.createQuery("from UserBean where username = :username")
.setParameter("username", username)
.list();
通过这种方式,您将来不会遇到更多参数问题。