簡體   English   中英

使用Hibernate防止SQL注入

[英]SQL injection prevention with hibernate

我有一個現有的代碼,其中應用程序根據很多條件生成不同的sql並通過休眠會話createSQLQuery()執行它們。 在這里,這些參數與作為普通字符串替換駐留在java類中的sql字符串相連接。 現在的問題是,我需要防止sql注入。 因此,為此,我必須使用getNamedQuery()並綁定參數,以便休眠將處理特殊字符。 但是問題在於將字符串sql的字符串移動到xml文件是一項開銷,因為有條件地生成sql的字符串。 因此,我決定手動進行特殊字符驗證,並將其附加到字符串查詢中,然后按原樣執行。 因此,然后我檢查發現的PrepareStatement的來源,它只是拋出異常

byte[] arrayOfByte1 = new byte[0];
try
{
   arrayOfByte1 = CharsToBytes(this.OdbcApi.charSet, arrayOfChar);
}
   catch (UnsupportedEncodingException localUnsupportedEncodingException) {
}

我如何在參數與字符串查詢進行連接以消除SQL注入之前,在上述參數的Java類中進行相同類型的編碼? 還是有什么辦法我仍然可以保留字符串sql,因為它是一個附加參數並使用hibernate執行查詢?

據我所知,您想即時創建SQL查詢,因為條件的組合(我想是來自UI)可能非常復雜。 沒關系。 您需要控制的只是用戶提供的參數。 為此,您可以而且應該仍然使用Hibernate的createSqlQuery() 該功能可以理解? 用於位置參數(從查詢字符串的開頭編號)或:param_name語法,然后提供命名參數。 您無需將任何內容移動到xml文件中。

16.1.7節有示例。

如果您需要將定制SQL組合到查詢中,我發現編寫自己的包含定制SQL的條件類效果很好。

您只需要實現Criterion接口。 https://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/criterion/Criterion.html

(另請參見“非空”的Hibernate實現: http//www.grepcode.com/file/repo1.maven.org/maven2/org.hibernate/hibernate/3.2.4.sp1/org/hibernate/criterion/ NotNullExpression.java?av=f 。)

然后,您可以使用正常的休眠條件API輕松構建每個自定義查詢。

https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html#querycriteria-creating

正確清理SQL值很痛苦-盡力避免它! ;-)

暫無
暫無

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

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