我正在使用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
将在创建预准备语句后和执行查询之前填充查询的占位符,并且查询处理引擎知道应转义哪些(可能是恶意的)字符。
这是常见的方法。
setString
是setParameter
的非通用吊坠。setParameter
自动检测数据类型。
一个小的改进是使用命名参数绑定,例如:
List<UserBean> users = session.createQuery("from UserBean where username = :username")
.setParameter("username", username)
.list();
这样,您将来不会遇到更多参数的问题。