2009-04-13 58 views
21

在ASP.NET MVC(缺省路由),我想使用URL這樣的返回與表單視圖編輯顧客:在ASP.NET MVC中比隱藏表單字段更安全嗎?

/Customers/Edit/5 

我需要利用CustomerId=5,但我不希望允許客戶改變it.Right現在我做隱藏ID使用:

<%= Html.Hidden("CustomerId") %> 

這實現了我想要的東西,但我的印象就是那個隱藏的表單變量是不安全的,可以由最終用戶操縱。

那麼,允許客戶編輯他們的信息而不是他們的ID的最佳方式是什麼?

回答

12

我的解決辦法加密隱藏字段是從Steven Sanderson's ASP.NET MVC book使用防篡改碼。我們的想法是,你創建要防篡改任何隱藏的表單字段的哈希:

<%= Html.Hidden("CustomerId") %> 
<%= Html.Hidden("CustomerIdHash") %> 

當提交表單時,史蒂芬的代碼然後計算客戶編號的另一個哈希,使某些它等於CustomerIdHash。如果確實如此,則不會發生篡改。這是很棒的代碼,並且值得這本書的價格。

6

你不會在瀏覽器端做任何真正的安全。您可以將客戶ID放入查詢字符串中,但服務器應驗證他們是否真的被允許編輯該客戶。如果不是,則返回錯誤。

10

在顯示相關視圖之前,檢查控制器操作(/ Customers/Edit)中的權限。請注意,這裏的問題與您的隱藏字段完全不同:用戶只需在瀏覽器中輸入「http://yoursite.com/Customers/Edit/10」即可。因此,無論他如何調用該操作,您都必須檢查您的操作是否允許用戶編輯請求的客戶的詳細信息。

+1

我看到如何配置控制器操作,以便只有授權用戶才能看到特定ID的視圖,但我看不到如何防止用戶更改該ID。例如,用戶可能被授權查看/ Customers/Edit/10,但是他們可以在提交表單時更改ID並編輯他們未被授權查看的ID(例如/ Customers/Edit/11)。我想我需要檢查提交的表單,以確保ID是我發送給他們的第一位。 – royco 2009-04-20 05:37:58

+1

您必須檢查當前登錄的用戶是否有權查看/編輯所請求的ID。因此,在您的控制器操作中,您檢索用戶名(例如使用Thread.CurrentPrincipal.Identity.Name),並檢查您的數據庫是否允許此用戶執行他嘗試執行的操作(根據請求的操作查看或編輯)。因此,如果用戶更改了ID,他仍然無法查看\編輯他不允許的內容。實際上,他甚至沒有理由嘗試改變ID ... – 2009-04-20 07:32:13

1

有兩個方面。我不確定你是直接詢問的,但它們都很重要:

  • 對於任何給定的用戶,他們可能不被允許編輯所有客戶。因此,正如德米特里所建議的,您的表單發佈的控制器操作需要查看他們正嘗試編輯的客戶,並驗證登錄的用戶實際上是否允許編輯該客戶。您可能還想在首先生成編輯表單的控制器操作中執行類似的檢查,如果不允許編輯請求的客戶,甚至不會讓他們進入表單。
  • 對於給定的用戶和給定的客戶,您可能不希望用戶能夠更改客戶ID。如果您在POST控制器操作中使用UpdateModel方法,則需要使用屬性白名單參數並排除ID屬性,以便用戶不更改ID。即使他們更改隱藏字段的值,UpdateModel也會通過白名單忽略已更改的值。
2

我有同樣的問題,我相信解決方案涉及使用代理鍵。在每個有ID列的表中,我還添加一個Guid(SQL服務器中的uniqueidentifier)的Key列。現在,當進行連接或任何內部邏輯時,我使用該ID,但控制器都使用密鑰。既然是Guid,很難猜出另一張唱片的Guid是什麼。

可替換地(或附加於上述),你可以根據This article

3

防篡改隱藏字段都很好,但仍然通過默默無聞的安全。通過保護控制器和操作來保證網站,尤其是MVC是最好的。然後用戶可以篡改他們想要的一切,而且他們不會去任何地方。