我不喜欢Ruby语言,因为它没有静态类型,但是当我花更多时间使用Spring/Hibernate时,我越来越欣赏Ruby on Rails的功能。特别是他们的Active Record模型可以为你避免SQL注入。那么使用Spring/Hibernate框架时,通常会如何处理这个问题呢?是否有一些清洗工具包,以确保用户输入是安全的?
如果你只是插入DAO,这并不是什么大问题,但是在使用Select语句时,这是一个很大的问题。
我不喜欢Ruby语言,因为它没有静态类型,但是当我花更多时间使用Spring/Hibernate时,我越来越欣赏Ruby on Rails的功能。特别是他们的Active Record模型可以为你避免SQL注入。那么使用Spring/Hibernate框架时,通常会如何处理这个问题呢?是否有一些清洗工具包,以确保用户输入是安全的?
如果你只是插入DAO,这并不是什么大问题,但是在使用Select语句时,这是一个很大的问题。
如果你正确使用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注入。
我认为你已经回答了自己的问题 - 如果你只在最后一步使用HQL,那么这可能排除了95%的潜在攻击点。而且,因为你只在那些棘手的边缘情况下使用它,你很可能会更加关注你实际正在做什么。