2017-04-17 167 views
1

我使用Struts2的框架和休眠,我提高,我並沒有開始一個系統,我提高了系統的某些功能,並實現它的刺。但是,他們掃描它使用Acunetix時,某處在登錄模塊,也有在系統中檢測到了一些威脅(警報),其中警告說:是否Hibernate的Query.setParameter使SQL注入可能

警報:SQL注入

嚴重性 :高

描述:此腳本可能容易受到SQL注入攻擊。

建議:您的腳本應該過濾來自用戶輸入的元字符。查看詳細信息以獲取有關修復此漏洞的更多信息。

然後,我檢查了腳本,這將是該警報的故障。舊開發人員使用Hibernate創建查詢。

List<UserBean> users = session.createQuery("from UserBean where username =?") 
    .setParameter(0,username) 
    .list(); 

我的問題是:

-Is這個查詢使用Hibernate無法避免SQL注入?

-Is .setParameter應該是.setString更具體以避免SQL注入?

或以上都不是?

謝謝你的時間。

回答

3

如果您使用這樣的Hibernate查詢參數綁定,那麼您可以免受SQL注入攻擊。

與字符串連接相反,setParameter將在創建預準備語句並執行查詢之前填充查詢的佔位符,並且查詢處理引擎知道應該轉義哪些(可能是惡意的)字符。

這是常見的路線。

setStringsetParameter的非通用吊墜。 setParameter自動檢測數據類型。

小的改進是使用命名參數結合,例如:

List<UserBean> users = session.createQuery("from UserBean where username = :username") 
.setParameter("username", username) 
.list(); 

這樣你不會得到更多的問題,在未來更多的參數。

+0

這爲我解釋了很多,但爲什麼它警告即使我將它與名稱綁定,它在SQL注入中也很容易。 – msagala25

+0

我完全不知道Acunetix工具,因此您必須向該專題的專家詢問爲什麼報告確實會這樣說。也許這只是因爲該工具沒有找到任何驗證輸入的代碼,並且它不知道Hibernate或準備好的語句是如何工作的。 –