2011-01-27 49 views
16

我讨厌Ruby语言,因为它不是静态类型的,但我花在Spring/Hibernate上的时间越多,我越感激Ruby on Rails的功能。具体来说,他们的Active Record模型可以为您预防SQL注入。 Spring/Hibernate堆栈通常如何处理这个问题?是否有人使用某种清理工具包,以确保您的用户输入是安全的?SQL注入通常在Spring/Hibernate设置中停止

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

回答

30

当你使用Hibernate时,SQL注入不应该是一个风险 - 只要你正确地使用它。

Hibernate查询可以使用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注入。但是,你永远不应该写这样的查询!我不认为任何框架会保护你,如果你追加字符串到你的查询。

最后,如果您使用Hibernate Criteria API,您将自动受到SQL注入的保护;因为当您使用Criteria API时,Hibernate会以防止SQL注入的方式构建基础查询。

1

我认为你已经回答了你自己的问题 - 如果你只使用HQL作为最后的手段,那么可能会削减95%的潜在攻击点。而且,因为你只是在那些棘手的边缘情况下使用它,你可能会更注意你实际上在做什么。