2008-09-22 46 views
9

傳統主義者認爲存儲過程比使用NHibernate等對象關係映射(ORM)框架提供更好的安全性。在使用NHibernate時實現安全性的最佳實踐是什麼?

爲了反駁這個觀點,可以使用NHibernate來確保適當的安全性(例如,防止sql注入等)的一些方法是什麼?

請提供每個答案只有一種方法)

回答

3

使用專用的,鎖定的SQL帳戶

6

其實,如果你使用SQL或者HQL來構建你的NHibernate容易受到SQL注入查詢。確保你使用參數化查詢,如果你需要這樣做,否則你正在設置一個痛苦的世界。

+0

我想你的意思是,儘可能使用標準和表達模式,而不是HQL。我有這樣的印象,即HQL本身就是參數化的 - 你有鏈接可以顯示HQL如何用於注入? – 2008-09-24 01:30:22

+0

HQL被參數化。你不能在你的HQL中連接字符串,或者你正在做和SQL一樣的事情。 – 2008-09-24 13:13:07

7

保護您的連接字符串。

從.NET 2.0和NHibernate 1.2開始,很容易在配置文件中使用加密連接字符串(和其他應用程序設置)。將連接字符串存儲在<connectionStrings>塊中,然後使用NHibernate connection.connection_string_name屬性代替connection.connection_string。如果您運行的是網站而不是Windows應用程序,則可以使用aspnet_regiis命令行工具對<connectionStrings>塊進行加密,同時將其餘的NHibernate設置保留爲純文本以便於編輯。

如果數據庫平臺支持,另一種策略是對數據庫連接使用集成身份驗證。這樣,你(希望)不會在你的配置文件中以明文存儲憑證。

2

一個我贊成在ORM的存儲過程的聽到的論點是,他們不希望人們做爲所欲爲數據庫。他們不允許在表格上選擇/插入/更新/刪除。每個行動都通過由DBA審查的程序進行控制。我可以理解這個想法來自哪裏......特別是當你有一羣業餘愛好者全都用他們的手你的數據庫。

但時代已經改變,NHibernate是不同的。它非常成熟。在大多數情況下,它會比DBA編寫更好的SQL :)。

你仍然必須保護自己免於做一些愚蠢的事情。正如蜘蛛俠所說:「擁有強大的力量帶來了巨大的責任」我認爲讓NHibernate通過其他方式(如審計日誌記錄和定期備份)正確訪問數據庫和控制操作更爲合適。如果有人要做一些愚蠢的事情,你總是可以恢復。

1

大多數ORM的句柄SQL注入通過創建參數化查詢。在NHibernate中,如果您正在使用LINQ to NHibernate或Criteria/Query over編寫查詢方法,則查詢會自動進行參數化,如果您自己動態創建HQL/SQL查詢,那麼您將更加自由,並且必須牢記您的查詢將不得不被參數化。