2010-12-13 74 views
5

的安全問題我開始學習JPA,並且我有大量的遺留EJB2.0代碼需要重構才能使用新功能以及我將添加到代碼庫中的任何新功能。在我的代碼中是否需要考慮新的攻擊媒介,還是防禦性編程會覆蓋我?我需要留意的Java持久性API(JPA)

回答

6

JPA就像JDBC:後端技術。適用於JDBC的安全問題適用於JPA。因此,大多數安全考慮將在應用程序級別上實現,或由前端API處理。但事實上JPQL注入是一個你應該知道的明顯的注入。

JPQL注:

使用SQL或JDBC API時一樣,你永遠不應該直接將參數添加到查詢字符串。您應該使用Query對象上的setParameter(適用於特別和命名查詢),或者可以使用JPA criteria API(儘管命名查詢提供最佳性能)。

Query query = em.createQuery("DELETE Order WHERE customer = :customer"); 
query.setParameter("customer", customer); 
query.executeUpdate(); 

數據庫權限:

對於額外的安全性,你可以把多個持久單元(PU),因此任何安全漏洞的影響是有限的。例如,您可以創建具有不同數據庫訪問權限的多個PU:一個具有更新權限,另一個具有隻讀查詢訪問權限。只要意識到這樣的決定會影響你的應用程序設計。

+0

你是否在你的應用層創建PreparedStatements?使用它們(AFAIK)是防止SQL注入的主要防禦措施,通常在數據層創建。 – bakoyaro 2010-12-13 18:22:37

+1

好點。如果最佳實踐成爲習慣,你有時會忘記不好的選擇。我將它添加到我的答案中。 – Kdeveloper 2010-12-13 23:59:40

+1

每當你開發一個純文本協議,俄羅斯黑客利用你的類型安全缺乏。 – 2010-12-14 01:14:08

1

如果您是從一個不受信任的源接收的字節反序列化一個對象,那麼它可以導致啓動類路徑上的任何類加載,無論是否公開,並導致該類初始化運行。它也可以通過具有副作用的構造函數和通過自定義反序列化方法獲得權限。

如果你的類路徑中包括衆所周知的公開課與無限的權力,如Rhino解釋附帶最近的JVM,或者javax.tools接口javac的,這種權力是通過序列化類的構造函數訪問,那麼攻擊者可以使用它來執行任意的java代碼。實際上,這意味着通過java.lang.Runtime具有當前用戶的特權的任意用戶鈴聲代碼。

第一個標準很容易滿足。第二個可能不太容易滿足。

+1

不知道這是否與JPA有任何關係。 – Kdeveloper 2010-12-14 10:03:10

+0

+1感謝您的意見,他們是有效的擔憂。 – bakoyaro 2010-12-14 14:37:50

+0

@Kdeveloper,我的印象是JPA實體需要可序列化。但你說得對;如果您的JPA實體沒有使用java序列化進行持久化,那麼我的帖子就無關緊要了。 – 2010-12-14 23:18:36