在Spring/Hibernate环境下,通常如何防止SQL注入?

18

我不喜欢Ruby语言,因为它没有静态类型,但是当我花更多时间使用Spring/Hibernate时,我越来越欣赏Ruby on Rails的功能。特别是他们的Active Record模型可以为你避免SQL注入。那么使用Spring/Hibernate框架时,通常会如何处理这个问题呢?是否有一些清洗工具包,以确保用户输入是安全的?

如果你只是插入DAO,这并不是什么大问题,但是在使用Select语句时,这是一个很大的问题。

2个回答

35

如果你正确使用Hibernate,则不应该存在SQL注入风险。

Hibernate查询通常使用HQL(类似于SQL的Hibernate查询语言)编写,或者使用面向对象的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注入的保护。但是你永远不应该编写像这样的查询语句!我认为任何框架都无法保护你,如果你将字符串附加到查询中的话。

最后,如果你使用Hibernate Criteria API,你将自动获得SQL注入的保护;因为当你使用Criteria API时,Hibernate构建底层查询的方式可以防止SQL注入。


1

我认为你已经回答了自己的问题 - 如果你只在最后一步使用HQL,那么这可能排除了95%的潜在攻击点。而且,因为你只在那些棘手的边缘情况下使用它,你很可能会更加关注你实际正在做什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接