2012-09-26 22 views
6

我最近繼承了ASP.NET MVC 4代碼庫。我注意到的一個問題是在網址中使用了一些數據庫ID(整數)以及HTML表單提交。目前狀態下的代碼可以通過URL修改和創建具有不同數字的自定義HTML帖子來利用。如何防止我的HTML在避免GUID時被利用?

現在,雖然我可以通過使用會話狀態或其他身份驗證檢查輕鬆解決URL問題,但我並不確定嵌入到網站吐出的HTML中的數據庫ID(即,我給他們下拉到填)。當ids回來後,我怎麼能確定我把它們作爲有效的選項? 在解決這個問題方面被認爲是「最佳實踐」?

雖然我很欣賞我可以「引導它」,但我很猶豫,因爲我發現它們在調試數據庫的過程中遇到麻煩。

我在這裏有選擇嗎?我必須通過GUID來防止輕鬆猜測ID或者是否有某種DRY機制可用於驗證ID在他們回到網站時的使用情況?

更新:一位評論者詢問我期待的漏洞。比方說,我吐出一張HTML表格,裏面有一個可以導入「寶藏」的所有位置的下拉列表。用戶擁有的位置的ID是1,2和3,這些位置在HTML中提供。但用戶檢查html,並與它一起擺弄,並決定放置一個POST的ID爲4的選定。 4不是他的位置,是他人的位置。

+3

通過什麼機制,你期待的利用?在什麼情況下襬弄數據可能會危害您的系統?使用GUID不會使任何內容更安全。 – PhonicUK

+0

爲您更新了OP。 Guids在這種情況下更安全,因爲你無法猜測它們。 – Quibblesome

回答

9

驗證傳遞的ID與用戶可修改的ID。

看起來很乏味,但這確實是確保用戶能夠訪問他們想要修改的內容的唯一方法。在沒有驗證的情況下使用GUID是安全的:默然猜測它們是困難的,但是如果給予足夠的資源,你可以猜測它們。

您可以在控制器頂部執行此操作,然後對發佈的數據執行任何其他操作。如果存在違規,只需拋出一個異常並讓全局異常處理程序處理它;因爲您可以安全地假定用戶以不支持的方式篡改數據,所以您無需以一種非常好的方式處理它。

+1

再一次編輯:_it可能會看到** m ** tedious_。 ; p - 我打算這樣做,但看到你自己編輯,不想碰撞。 ;-) –

+0

@BradChristie - 完成! – Omar

+0

所以,如果我直接得到這個意思,這意味着asp.net提供的API角色屬性(至少在設計上)或多或少不值錢(肯定它們有一點幫助,但它們不是用於身份驗證的銀彈)作爲無論如何我們都需要驗證大部分用戶操作。我說毫無價值,因爲如果一個人使用它們,那麼基本上就是將API的頂部的屬性和代碼之間的認證代碼分開,在那裏將所有認證放在一個地方更加簡單....我猜我在問什麼如果你仍然在使用它們。 – Quibblesome

4

你描述被稱爲問題「不安全的直接對象引用,」和OWASP組建議處理這個問題兩個策略:

  1. 使用基於會話的間接對象引用,並
  2. 驗證所有對對象引用的訪問。

的建議#1的一個例子將是這種代替具有下拉選項1,2,和3中,所分配的每個選項與原始ID在用戶的會話的地圖相關聯的GUID。當你從那個用戶那裏得到一個POST時,你檢查看給定的ID應該綁定到什麼對象。 OWASP的ESAPI有一些圖書館可以用不同的語言來提供這方面的幫助。

但在許多情況下,建議#1實際上是適得其反。例如,在很多情況下,您希望將URL從一個用戶複製/粘貼到另一個用戶。流程#2通常被認爲是解決這個問題的最簡單的方法。

2

您正在描述帶有不安全ID的Broken Access Control。一旦你已經確定的威脅,並決定其ID是由某些用戶擁有,確保檢查到位爲這個服務器端。

相關問題