2009-09-09 144 views
1

在我與之合作的公司中,我們經常需要與客戶端的基礎架構進行集成。最近,在聽說我們使用Hibernate之後,一個客戶端表現出以下擔憂:由於Hibernate連接到數據庫的用戶可以直接訪問表並且Hibernate動態地生成SQL,因此這樣的用戶可以在數據庫中執行任何操作。休眠安全理解:休眠與存儲過程

如果用戶只有執行存儲過程的權限,那麼SP可以限制數據,但更重要的是他可以向數據庫發出的查詢類型:基本上沒有動態注入SQL。因此,如果存在一個消除行的存儲過程,那麼獲取用戶憑據的惡意人員將能夠一次性刪除單行,但無法發出DELETE *。我知道Hibernate也可以映射視圖,但這又限制了數據,而不是用戶可以執行的操作。 Hibernate也可以執行SP,但是這在很大程度上違背了使用Hibernate的目的,並且意味着應用程序的完全重寫。

雖然我不認爲這是主要問題,但由於應用程序服務器也提供安全性,所以我有一個說服客戶端的問題。你對此有何看法? Hibernate是否真的比使用存儲過程的應用程序更安全?在使用Hibernate時可以採用哪些額外的安全措施?

+0

爲什麼不創建視圖,然後使用它們的授予權限來防止刪除?這個問題似乎與Hibernate/NHibernate沒有任何關係。 –

+0

http://en.wikipedia.org/wiki/Fear,_uncertainty_and_doubt – mxmissile

回答

7
  1. NHibernate的可以映射到存儲過程,而不是表
  2. 可以映射讀取操作到表/視圖,插入/更新/刪除操作上,如果你喜歡
  3. NHibernate的不生成參數化的SQL存儲過程,也就是說,沒有SQL注入的機會,如果你決定通過生成CRUD方法爲每個表,並分配給映射到表和/或視圖
  4. 使用存儲過程的大多數項目開始
  5. 用戶權限總是可以限制對某些表的某些操作,執行第所有的錯誤 - 這並不比訪問表的訪問更安全
+1

很好的答案。這是NHibernate開發人員爲DBA想要鎖定數據庫的場景所建議的。 http://ayende.com/Blog/archive/2006/10/04/ShouldYouUseNHibernateWithStoredProcedure.aspx –

1

我假設Hibernate使用參數化查詢。這應該可以緩解SQL注入的許多問題。您還可以防止用戶帳戶能夠完成數據庫中的所有操作。畢竟,它不需要成爲SA賬戶。

+0

確實,hibernate可以在與其他數據庫訪問技術相同的限制下運行。如果開發者離開了他們這樣做的窗口,用戶將只能造成損害。 – Zoidberg

+0

我最初沒有說過,但是我們的想法是使用vanilla Hibernate。重寫應用程序以使用SP或參數化查詢或Hibernate與兩者結合使用會太昂貴,而且正是我希望避免的。 – Dan

0

如果我沒有弄錯NHibernate使用參數化的sql查詢。這將停止注射。

0

Hibernate當然只是一個ORM層over SQL。

在上面添加show_sql = true屬性,向他們展示正在生成的是什麼sql,並且他們將完全看到它的作用(參數化查詢如前所述)。

0

休眠可以比使用存儲過程安全,因爲從理論上講,DBA可以限制用戶訪問只調用存儲過程,而不是直接訪問底層數據結構。

在實踐和我的經驗中,這種安全方式以有意義的方式實現是極爲罕見的。如果存儲過程是爲每個CRUD操作編寫的,並且用戶被授予對所有存儲過程的訪問權限,那麼它們之間沒有真正的區別,只是授予底層結構本身的權限。

如果公司對SOX或安全合規性進行審計,他們可能會因沒有使用存儲過程而被拒絕。

可以在存儲過程中使用Hibernate,但是可以使用it seems like a pain in the ass

+0

一個區別是惡意用戶將無法執行批量刪除,或者爲了避免將一行寫入日誌表,如果寫入在Hibernate中實現,而不是作爲Db中的觸發器。 – Dan

+0

惡意用戶將無法執行批量刪除,除非您的應用進行批量刪除。一個繞過應用程序並使用應用程序使用的相同證書直接連接到數據庫的惡意黑客可能會這樣做,但這意味着您要麼將數據庫服務器從任何地方開放到連接,要麼您的應用程序服務器已被入侵 - 在這種情況下,您遇到的問題不僅僅是批量刪除。 –

+1

@Dan:「批量刪除」和編寫一個在循環中運行DELETE sp的程序之間有什麼區別,刪除所有記錄,除了執行時間和黑客的一點不便之處? –