簡體   English   中英

如何在Spring / Hibernate設置中停止SQL注入

[英]How is SQL injection typically stopped in a Spring/Hibernate setup

我討厭Ruby語言,因為它不是靜態類型,但我花在Spring / Hibernate上的時間越多,我就越感謝Ruby on Rails的功能。 特別是他們的Active Record模型阻止了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注入的保護; 因為Hibernate在使用Criteria API時會構建底層查詢,所以它會以防止SQL注入的方式實現。

我想你已經回答了自己的問題 - 如果你只是使用HQL作為最后的手段,那么這可能會減少95%的潛在攻擊點。 並且,因為你只是在那些棘手的邊緣情況下使用它,你可能會更加關注你實際在做什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM