簡體   English   中英

通過Hibernate-Criteria和Session.save(對象)進行SQL注入

[英]SQL Injection through Hibernate-Criteria & Session.save(object)

為了避免sql注入,通常可以在HQL中使用位置參數命名參數 ,因為它在這里進行演示而stackoverflow也有樣本。 我想知道在使用Criteria時可以采取哪些步驟。請提供示例代碼或有用鏈接的任何幫助。

編輯
當我們保存一個對象時呢? 比方說,該對象可能有一個String變量,有些人可以為它分配一個易受攻擊的SQL查詢。

 myObject.setName(somevulnerablesql); session.save(myObject); 

在這種情況下,我們是否必須在分配給對象之前單獨檢查用戶輸入? 或任何其他步驟,以避免此類SQL注入?

我非常確定Criteria-Object將創建安全的HSQL。

你必須小心Expression對象。 您可以在那里創建SQL注入。 但是看一下生成的SQL: Hibernate show real SQL

編輯:除非Hibernate中存在巨大的錯誤,否則您無需確保在保存之前對String進行轉義。 Hibernate使用預處理語句。 所以沒有字符串連接,也沒有Hibernate會話的SQL注入。

在使用Hibernate讀取輸出后,您可能必須轉義輸出。 例如:您有一個實體用戶

class User{
    String name;
}

並且您調用用戶“'或1 = 1; DROP DATABASE用戶; - ”該字符串將存儲在數據庫中。 如果您使用Criterion對象查詢用戶,您將找到他(刪除數據庫)。 如果使用Expression對象查詢User,則可以刪除數據庫(如果您隱藏了Strings)。

如果將用戶的名稱輸出為HTML,則必須轉義輸出。 否則,名為"/><script>evilJavascript()</script>將對您的應用程序不利。

編輯2:看看這里: https//www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet

Criteria不允許你自己編寫易受攻擊的SQL / HQL,因此SQL注入應該沒有任何問題(除非Hibernate本身存在錯誤)。

編輯

正如@ckuetbach所指出的,Criteria實際上允許您使用Expression.sql(String sql)Restrictions.sqlRestriction(String)編寫SQL。

暫無
暫無

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

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