2011-06-15 38 views
3

我對花旗集團的黑客事件 http://www.nytimes.com/2011/06/14/technology/14security.html?_r=2&pagewanted=1&ref=technology如何保護從黑客的MVC RESTful Url?

這讓我想到最近讀到一篇有趣的文章,說我有敏感的員工數據表中我擁有10萬行的數據庫。該表有一個稱爲Id的主鍵,它是一個標識列。

員工可以登錄Web Portal,並通過RESTful Url({Controller}/{Action}/{Id})檢索其詳細信息。 /員工/詳情/ 31

現在,什麼是阻止我用{Id}參數替換任何參數(例如Id = 32)和 檢索員工#32的詳細信息?這是花旗集團發生的事情嗎?

你如何預防這種情況?即用戶已經在門戶網站 上進行過身份驗證,但未授權查看其他用戶記錄?除了Id之外,我還需要爲 客戶使用其他特定的「令牌」嗎?

+0

只是爲了補充一點,我已經實現了一個自定義的Membership API,並且這個工作正常,即創建了使用FormsAuthentication和FormsAuthentication Ticket(Cookie)的Employee登錄。然後,我檢查員工是否處於角色,IsAuthenticated等等,以授予控制器和操作的權限。但是......這仍然無法阻止訪問不屬於他的數據,也就是說,我被授權和驗證以訪問/ Employee/Details我仍然可以替換任何(猜測的)EmployeeId? – 2011-06-15 17:04:45

+0

你也可以加密和解密你在你的網址中使用的所有ID,如果有人通過Skype將他的網址發送給某人,另一個人可以使用它 – Omu 2011-06-15 19:03:52

回答

3

這是我做了完全一樣的情況,首先我聲明的擴展對象:

public static bool Editable(this EXPENSE_OBJ e) 
{ 
    if (e != null) 
    { 
     UserRepository ur = new UserRepository(); 

     if (ur.CurrentUser().UserId == e.UserId) //Check if the user owns the claim 
     { 
      return true; //User owns the claim 
     } 
     else 
     { 
      return false; //User does not own the claim 
     } 

    } 
} 

然後在控制器中:

public ActionResult Details(id) 
{ 
    var item = repo.GetItem(id); 
    if(!item.Editable()) 
    { 
     return View("InvalidURL"); 
    } 

    ... 

} 
+0

嗨克里斯,讓我們說員工屬於公司,並檢索公司詳細信息我打電話/公司/詳細信息/ 101,即它再次是公司詳細信息的RESTful Url。在這種情況下,我猜我還需要傳入UserId並檢查用戶是否屬於他正在數據庫級檢索的公司。 – 2011-06-15 17:01:16

+0

+1這與我採取的方法大致相似。我的檢查對象擴展了一點,它允許管理角色用戶也可以查看/修改'用戶'對象 – 2011-06-15 17:29:32

+0

準確地說,雖然我個人實現了一個ur.CurrentUser(),所以我不必通過用戶標識。 – Chris 2011-06-16 08:35:06

0

您將需要使用ASP.NET角色和成員資格API。如果你已經這麼做了,那麼你需要做的就是使用IsUserInRole檢查來標記控制器。 您可以找到有關角色這裏類的詳細信息:

MSDN Roles Class

+0

嗨,羅伯特,我已經實現了我自己的會員和角色API和這工作正常,即我的應用程序。被認證,然後他被授權訪問該操作。但是,用戶然後使用Action從數據庫中檢索不同的數據集。我需要確保只能訪問他的數據。那有意義嗎? – 2011-06-15 16:56:50

0

我使用了一個多對多的表,用於保存用戶和實體的ID之間的關係他們被允許修改。每當有人試圖改變其中一個實體時,我會進行檢查以確保它們被允許執行此操作。我還在表格中放置了一個觸發器,該表格包含在刪除實體時將刪除該多對多表中的關聯記錄的實體。這對我來說非常有效。

你可以做的另一件事是使用Guid而不是int作爲主鍵。這會阻止人們猜測主鍵。