2012-04-05 92 views
6

這是一個初學者模式問題,用於Web表單數據類型的事情。我讀Exposing database IDs - security risk?和接受的答案讓我認爲這是浪費時間,但等待...將數據庫ID暴露給用戶界面

我有一個引用業務邏輯庫的MVC項目,以及引用相同的NHibernate SQL存儲庫的程序集。如果有什麼東西迫使我直接從我的控制器代碼庫中引用這些存儲庫,那麼我會知道出了什麼問題。但是當那些控制器在URL參數中使用數據庫記錄ID進行通信時,是否只有似乎錯誤?

我無法想象這些ID不會被消耗掉(通過MVC操作)。我不想認爲我會需要兩個對應於數據庫中同一行的UI實體。我不打算讓控制器以任何方式解釋ID。代理鍵將使零差異。不過,我想要解決這個問題,因爲關於關係設計的假設並不比跳層依賴關係更好。

如何構建一個只引用業務邏輯程序集並在BL對象和GUID中進行會話的Web應用程序,該程序只對該會話有意義,而程序集使用數據庫ID保留事務?

回答

3

您可以加密或者如果你願意的話可以散列你的ID。使用會話ID作爲鹽。這取決於上下文。一個公共購物網站,您希望目錄頁面清晰易讀,用戶帳戶管理員可以對ID進行加密,因此用戶無法將URL破解到其他人的帳戶中。

我不認爲這是安全的默默無聞。如果惡意用戶有一個被盜用的帳戶,他們可以查看以該用戶身份登錄時設置的所有表單字段,url id和cookie值。然後他們可以嘗試在以不同用戶身份登錄時使用這些權限以升級權限。但是通過使用session id作爲salt來保護它們,您已經鎖定了該數據,因此它僅在一個會話中有用。這些網頁甚至無法加入書籤。他們能否認出你的保護?有可能。但他們可能會轉移到另一個網站。鎖定你的車門實際上並不會讓任何人離開你的車,如果他們想要進入,但它會變得更加困難,所以每個人都這樣做。

+0

你給了我很多想法。你能否就如何實現映射以及在哪裏存儲它提出任何建議? 「會話」確實是ASP中最好的地方嗎? – 2012-04-06 19:06:33

+0

「映射」?不清楚你在找什麼。現場保護?我只是建議你做一個加密函數,它需要:FieldName,FieldValue,SessionID。然後當你解密你也需要提供全部3個解密。因此,另一個會話中的某個人根本無法劫持該值。應該是所有你需要的url參數。如果您需要支持無會話頁面,您可以使用硬編碼值而不是會話ID,但並不安全,但無會話頁面不應訪問任何敏感內容。 – 2012-04-06 22:09:57

+0

我在答案的核心問題上與會話分享了一些內容:根本沒有必要存儲/管理映射 - 它們會持續很長時間。這太棒了。謝謝。 – 2012-04-06 23:36:42

3

我不是安全專家,但我沒有問題將某些ID暴露給用戶,例如產品ID,用戶ID和用戶可以正常閱讀的任何內容,這意味着如果我向用戶顯示產品用戶,顯示其產品ID不是問題。

用戶不直接與之交互的系統內部事物,如交易ID,我沒有向用戶顯示,也不擔心他們以某種方式編輯它,但僅僅因爲這不是信息對他們有用。

很多時候在表單中,我會將操作指向「mysite.com/messages/view/5」,其中5是他們想查看的消息。在所有這些行動中,我總是通過簡單的數據庫檢查確保用戶有權查看它(修改或刪除,需要哪些功能),並確保登錄用戶與消息擁有者相同。

+0

是的,模糊URLs不暴露數據庫ID只是一種通過默默無聞的安全形式。您不應該依賴混淆的URL來提高安全性。您仍然需要積極實施適合您的應用程序的其他形式的權限管理。 – 2012-04-05 19:46:50

+0

你不應該僅僅依靠_only_。但是你也不需要讓黑客變得簡單。 – 2012-04-06 17:52:50

+0

我完全按照以下方式完成了完整性檢查:您顯示的是第5行的所有內容,如果您還說「如果您需要知道這是第5行」,那麼您會關心這些內容。我的問題主要是這樣的:我的視圖模型對我的BL對象有一個1-1,對我的ORM實體有一個1-1是巧合,我不想做一個約定。 – 2012-04-06 23:43:31

0

儘管您會發現有些人說ID只是實現細節,但在大多數系統中,您需要一種唯一標識域實體的方式,並且很可能您將爲該標識符生成一個ID。數據庫生成的生成的事實是一個實現細節;但一旦生成它就成爲域實體的一個屬性,因此在需要引用實體的任何地方使用它都是非常合理的。

2

由於參數篡改會導致數據修改,因此非常非常小心。暴露這些ID時,有關「誰可以訪問什麼ID」的規則必須非常仔細地內置到您的應用程序中。

例如,如果您基於OrderId更新訂單,請在您的Where子句中加載和更新: 其中order.orderid = passedInOrderId和Order。客戶ID =

我開發了一個擴展,以幫助在MVC可在這裏存儲的ID:

http://mvcsecurity.codeplex.com/

我也談了這點位在我的安全課程:Hack Proofing your ASP.NET MVC and Web Forms Applications

+0

您的codeplex項目看起來與我們在此使用的技術非常相似。但是我們不使用機器密鑰,我們使用來自數據庫支持會話的密鑰,因此它適用於所有不同的UI層框。我對每個認爲自己永遠不會有任何漏洞的人感到驚訝,因爲他們忽視了完美的用戶訪問驗證。這不僅僅是現實世界。 – 2012-04-06 14:08:42

+0

好的建議,它會在BL中進行許可/角色檢查,它在真實ID中運行。 – 2012-04-06 19:04:19

1

除了這些回覆之外,有時候使用明顯的id很好,所以人們可以根據他們想要的信息破解網址。例如,www.music.com \ artist \ acdc或www.music.com \ arist \ smashing-pumpkins。如果它對用戶有意義,並且您可以通過網址增加用戶從頁面中瞭解的信息,那麼情況會更好,尤其是如果您的市場部分年輕或技術精湛,那麼使用該ID對您有利。這也會提升你的搜索引擎優化。 我會說,當它不使用,然後編碼它。只有一名開發人員會犯一個錯誤,不會根據會話檢查客戶ID,而是暴露整個客戶羣。

但是,當然,你的單元測試應該抓住這個!

+0

這是另一個需要思考的問題 - 無論是內容豐富的還是臨時的和無意義的都很好,但我仍然認爲從數據庫中繼承是因爲不是;對於如何實際實現任何一種映射的任何建議?只是在用戶友好數據庫中的一列,我會認爲 – 2012-04-06 19:08:27

+0

哦,我明白了。你的意思是粉碎南瓜到1456789的映射。我認爲它必須是分貝中的另一列。但是我看到的大多數mvc示例都是在整個地方使用身份驗證。問題是1456789自動生成保證唯一。您嘗試對其他有意義的字段之一進行的操作可能不是唯一的,如果它不是唯一的,則嘗試將其用於查詢並不好。除非你做一些類似Hotmail,粉碎南瓜,粉碎pumpkins8973232等。 – 2012-04-06 22:14:29