2010-05-15 45 views
7

如果我的ChangePassword表單中包含用戶的隱藏ID字段,該怎麼辦?防止隱藏字段的變更

BadPerson知道GoodPerson的身份。他使用FireBug打開更改密碼錶單,將其ID更改爲GoodPerson的ID,以便GoodPerson更改密碼。

當然,我可以創造一些服務器邏輯,以防止這一點,但我覺得應該有一些開箱即用解決方案,拋出至極如果隱藏字段已經改變,至極我也不知道。

提前致謝。

編輯 好吧,更改密碼是一個壞榜樣。任何在隱藏字段中有id的編輯表單都有同樣的問題。

回答

6

沒有什麼,會讓你知道,一個隱藏字段的值的值已經改變與否。對於用戶更改密碼,這意味着他需要進行身份驗證。使用表單身份驗證時,當前已通過身份驗證的用戶的ID存儲在不可修改的加密cookie中。

這是說,你不應該用來存儲當前連接的用戶隱藏字段。只需使用內置的FormsAuthentication mechanism in ASP.NET,並且絕不將這些信息存儲在隱藏字段中。 ASP.NET知道cookie的價值沒有被篡改的方式是用配置中指定的machineKey對其進行簽名。

有安全和認證打交道時,你應該遵循的一個重要原則:始終使用內置的安全機制,從來沒有推出自己。

+0

我會第二個,不要嘗試自己做,使用表單身份驗證,它會照顧你所有的。 – Doobi 2010-05-15 13:23:26

+0

我還想補充一點,當允許用戶更改密碼時,讓他們輸入當前密碼以及新密碼通常是一個好主意。這提供了一個額外的驗證點,您可以執行。 – BradBrening 2010-05-15 13:24:55

+0

好吧,但如果它不是一個用戶,而是一些其他的對象,那麼存儲它的id就非常方便。 >沒有什麼,會讓你知道,一個隱藏字段的值的值已更改或不 我不同意這種說法。好的舊viewstate可以:)應該有我相信的東西。否則,在安全方面有一個巨大的漏洞。 – 2010-05-15 13:26:33

20

我同意Darin表單身份驗證會照顧上面提到的特定問題(更改密碼)。此答案適用於確保隱藏字段的值不會更改的更一般問題。

這個最好的解決辦法是,包括其中包含的第一個隱藏字段的值的散列另一個隱藏字段。這樣,如果第一個隱藏字段被更改,您將會知道它。生成的HTML看起來是這樣的:

<input id="productId" name="productId" type="hidden" value="1" /> 
<input id="productId_sha1" name="productId_sha1" type="hidden" value="vMrgoclb/K+6EQ+6FK9K69V2vkQ=" /> 

This article展示瞭如何做到這一點,包括延期Html.SecuredHiddenField這會照顧邏輯,爲你的源代碼。

+1

正確的鏈接是:http://blog.slatner。COM /令人討厭/固定形式的值,在-ASP淨mvc.html。 謝謝 – 2016-08-16 13:50:40