我正在使用Struts2框架和Hibernate,我正在增强一个我没有启动的系统,我增强了系统的一些功能并在产品上实现了它。但是,当他们使用登录模块中的Acunetix进行扫描时,系统中检测到一些威胁(警报),其中警报显示:
警报:SQL 注入
严重性:高
描述:该脚本可能容易受到 SQL 注入攻击。
建议:您的脚本应该过滤用户输入中的元字符。查看详细信息以获取有关修复此漏洞的更多信息。
然后,我检查了该警报中出现错误的脚本。老开发人员使用 Hibernate 创建查询。
List<UserBean> users = session.createQuery("from UserBean where username =?")
.setParameter(0,username)
.list();
Run Code Online (Sandbox Code Playgroud)
我的问题是:
- 使用 Hibernate 的此查询是否无法避免 SQL 注入?
-.setParameter是否应该.setString更具体以避免 SQL 注入?
或者以上都不是?
谢谢你的时间。
如果您像这样使用 Hibernate 查询参数绑定,您就可以免受 SQL 注入攻击。
与字符串连接相反,setParameter将在创建准备好的语句之后和执行查询之前填充查询的占位符,并且查询处理引擎知道应该转义哪些(可能是恶意的)字符。
这是常见的方法。
setString是非通用吊坠setParameter。setParameter自动检测数据类型。
一个小的改进是使用命名参数绑定,例如:
List<UserBean> users = session.createQuery("from UserBean where username = :username")
.setParameter("username", username)
.list();
Run Code Online (Sandbox Code Playgroud)
这样您将来就不会因更多参数而遇到更多问题。