傳統主義者認爲存儲過程比使用NHibernate等對象關係映射(ORM)框架提供更好的安全性。在使用NHibernate時實現安全性的最佳實踐是什麼?
爲了反駁這個觀點,可以使用NHibernate來確保適當的安全性(例如,防止sql注入等)的一些方法是什麼?
(請提供每個答案只有一種方法)
傳統主義者認爲存儲過程比使用NHibernate等對象關係映射(ORM)框架提供更好的安全性。在使用NHibernate時實現安全性的最佳實踐是什麼?
爲了反駁這個觀點,可以使用NHibernate來確保適當的安全性(例如,防止sql注入等)的一些方法是什麼?
(請提供每個答案只有一種方法)
使用專用的,鎖定的SQL帳戶
其實,如果你使用SQL或者HQL來構建你的NHibernate容易受到SQL注入查詢。確保你使用參數化查詢,如果你需要這樣做,否則你正在設置一個痛苦的世界。
保護您的連接字符串。
從.NET 2.0和NHibernate 1.2開始,很容易在配置文件中使用加密連接字符串(和其他應用程序設置)。將連接字符串存儲在<connectionStrings>
塊中,然後使用NHibernate connection.connection_string_name
屬性代替connection.connection_string
。如果您運行的是網站而不是Windows應用程序,則可以使用aspnet_regiis
命令行工具對<connectionStrings>
塊進行加密,同時將其餘的NHibernate設置保留爲純文本以便於編輯。
如果數據庫平臺支持,另一種策略是對數據庫連接使用集成身份驗證。這樣,你(希望)不會在你的配置文件中以明文存儲憑證。
一個我贊成在ORM的存儲過程的聽到的論點是,他們不希望人們做爲所欲爲數據庫。他們不允許在表格上選擇/插入/更新/刪除。每個行動都通過由DBA審查的程序進行控制。我可以理解這個想法來自哪裏......特別是當你有一羣業餘愛好者全都用他們的手你的數據庫。
但時代已經改變,NHibernate是不同的。它非常成熟。在大多數情況下,它會比DBA編寫更好的SQL :)。
你仍然必須保護自己免於做一些愚蠢的事情。正如蜘蛛俠所說:「擁有強大的力量帶來了巨大的責任」我認爲讓NHibernate通過其他方式(如審計日誌記錄和定期備份)正確訪問數據庫和控制操作更爲合適。如果有人要做一些愚蠢的事情,你總是可以恢復。
OWASP提到SQL注入漏洞的一種形式中的ORM工具的上下文(並HQL注射爲例):http://www.owasp.org/index.php/Interpreter_Injection#ORM_Injection
大多數ORM的句柄SQL注入通過創建參數化查詢。在NHibernate中,如果您正在使用LINQ to NHibernate或Criteria/Query over編寫查詢方法,則查詢會自動進行參數化,如果您自己動態創建HQL/SQL查詢,那麼您將更加自由,並且必須牢記您的查詢將不得不被參數化。
我想你的意思是,儘可能使用標準和表達模式,而不是HQL。我有這樣的印象,即HQL本身就是參數化的 - 你有鏈接可以顯示HQL如何用於注入? – 2008-09-24 01:30:22
HQL被參數化。你不能在你的HQL中連接字符串,或者你正在做和SQL一樣的事情。 – 2008-09-24 13:13:07