Asp.net-Mvc
防止更改隱藏欄位
如果我有帶有隱藏使用者 ID 欄位的 ChangePassword 表單怎麼辦。
BadPerson 知道 GoodPerson 的 id。他使用 FireBug 打開 Change Password 表單,將他的 ID 更改為 GoodPerson 的 ID,因此 GoodPerson 的密碼也隨之更改。
當然,我可以創建一些伺服器邏輯來防止這種情況發生,但我認為應該有一些開箱即用的解決方案,如果隱藏欄位被更改,它會拋出,我不知道。
編輯 好的,更改密碼是一個不好的例子。我在隱藏欄位中有 id 的任何編輯表單都有同樣的問題。
沒有什麼可以讓您知道隱藏欄位的值是否已更改。使用者更改密碼意味著他需要進行身份驗證。使用表單身份驗證時,目前經過身份驗證的使用者的 ID 儲存在無法修改的加密 cookie 中。
這就是說您不應該使用隱藏欄位來儲存目前連接的使用者。只需使用 ASP.NET 中內置的FormsAuthentication 機制,永遠不要將此類資訊儲存在隱藏欄位中。ASP.NET 知道 cookie 的值未被篡改的方式是它使用配置中指定的machineKey對其進行簽名。
在處理安全和身份驗證時,您應該遵循一條重要的規則:始終使用內置的安全機制,永遠不要使用自己的安全機制。
我同意 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=" />本文展示瞭如何做到這一點,並包含一個擴展的原始碼
Html.SecuredHiddenField,它將為您處理邏輯。