当您使用Hibernate时,SQL注入不应该是一个风险 - 只要您正确使用它。
休眠查询要么用 HQL(Hibernate 的类似 SQL 的查询语言)编写,要么使用面向对象的 Criteria API 实现。
HQL是最常见和最推荐的。通常,您会编写如下 HQL 查询:
Subscription sub = (Subscription) sessionFactory.getCurrentSession()
.createQuery("from Subscription sub where sub.verification = :verification")
.setString("verification", verification)
.uniqueResult();
在这种形式中,您可以免受SQL注入的保护,因为Hibernate将字符串作为参数传入;它不能被解释为SQL的一部分。
但是,如果您行为恶劣,请编写这样的查询...
Subscription sub = (Subscription) sessionFactory.getCurrentSession()
.createQuery("from Subscription sub where sub.verification = '" + verification + "'")
.uniqueResult();
...那么你就不会受到SQL注入的保护。但是,您永远不应该编写这样的查询!我不认为任何框架会保护你,如果你将字符串附加到你的查询。
最后,如果您使用休眠条件API,则会自动保护您免受SQL注入;由于 Hibernate 会在您使用条件 API 时生成基础查询,因此它以阻止 SQL 注入的方式进行构建。