Hibernate的createCriteria()清理输入吗?

Mar*_*rvo 6 java hibernate sql-injection

今天遇到了一些使用Hibernate执行查询的代码.该查询使用从表单提交的值.这让我很好奇这种代码是否"消毒"了它的输入.

public List<School> search(String query) {
    Session session = this.getCurrentSession();
    query = "%" + query + "%";
    Criteria criteria = session.createCriteria(getPersistentClass());
    criteria.createAlias("country", "a");
    Criterion nameCriterion = Restrictions.ilike("name", query);
    Criterion cityCriterion = Restrictions.ilike("city", query);
    Criterion countryCriterion = Restrictions.ilike("a.name", query);
    Criterion criterion = Restrictions.or(Restrictions.or(nameCriterion, cityCriterion), countryCriterion);
    criteria.add(criterion);
    return criteria.list();
}
Run Code Online (Sandbox Code Playgroud)

这样安全吗?

Ank*_*sal 5

Hibernate Criteria Queries 在 Sql 注入方面是非常安全的,因为它们在执行任何提取时将字符串作为参数传递。甚至,除非您通过字符串文字构建查询,否则 Hql 是非常安全的。

有关更多详细信息,您应该查看通过打开休眠 sql 日志记录在数据库级别触发的查询。


dce*_*chi 5

如果您考虑SQL注入攻击,那么是的,Hibernate Criteria API是安全的.

它将通过首先从指定的查询字段编译它并且仅在应用查询参数之后生成基础查询(它应该使用经典查询PreparedStatement).这样,JDBC驱动程序将知道查询的哪个部分是字段,哪个部分是参数.然后驱动程序将注意清理参数.

Criteria如果你需要在那里放置参数,你应该注意应用的SQL限制.例如

String vulnerable = //parameter from user interface 

criteria.add(
    Restrictions.sqlRestriction("some sql like + vulnerable") //vulnerable

criteria.add(
    Restrictions.sqlRestriction("some sql like ?", 
              vulnerable, Hibernate.STRING)) //safe
Run Code Online (Sandbox Code Playgroud)

在这种情况下,vulnerable参数可以"泄漏"到查询字段部分,并被JDBC驱动程序检查绕过,就像在正常的易受攻击的SQL查询中一样.