我討厭Ruby語言,因爲它不是靜態類型的,但我花在Spring/Hibernate上的時間越多,我越感激Ruby on Rails的功能。具體來說,他們的Active Record模型可以爲您預防SQL注入。 Spring/Hibernate堆棧通常如何處理這個問題?是否有人使用某種清理工具包,以確保您的用戶輸入是安全的?SQL注入通常在Spring/Hibernate設置中停止
如果你只是插入DAO,這對插入來說並不是什麼大問題,但是在使用Select語句時這是一個主要問題。
我討厭Ruby語言,因爲它不是靜態類型的,但我花在Spring/Hibernate上的時間越多,我越感激Ruby on Rails的功能。具體來說,他們的Active Record模型可以爲您預防SQL注入。 Spring/Hibernate堆棧通常如何處理這個問題?是否有人使用某種清理工具包,以確保您的用戶輸入是安全的?SQL注入通常在Spring/Hibernate設置中停止
如果你只是插入DAO,這對插入來說並不是什麼大問題,但是在使用Select語句時這是一個主要問題。
當你使用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注入的方式構建基礎查詢。
我認爲你已經回答了你自己的問題 - 如果你只使用HQL作爲最後的手段,那麼可能會削減95%的潛在攻擊點。而且,因爲你只是在那些棘手的邊緣情況下使用它,你可能會更注意你實際上在做什麼。