防止隐藏领域的变化

时间:2010-05-15 13:12:00

标签: asp.net-mvc security forms asp.net-mvc-2

如果我的ChangePassword表单包含用户的隐藏ID字段,该怎么办?

BadPerson知道GoodPerson的ID。他用FireBug打开Change Password表单,将他的Id更改为GoodPerson的Id,因此GoodPerson的密码更改。

当然我可以创建一些可以防止这种情况的服务器逻辑,但我认为应该有一些开箱即用的解决方案,如果隐藏字段已被更改,我将不知道。

提前感谢。

修改 好的,更改密码是个坏例子。我在隐藏字段中具有id的任何编辑表单都存在同样的问题。

2 个答案:

答案 0 :(得分: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 :(得分:7)

没有什么可以让你知道隐藏字段值的值是否已经改变。对于用户更改其密码,这意味着他需要进行身份验证。使用表单身份验证时,当前经过身份验证的用户的ID存储在无法修改的加密cookie中。

这就是说您不应该使用隐藏字段来存储当前连接的用户。只需使用内置的FormsAuthentication mechanism in ASP.NET,并且永远不会将此类信息存储在隐藏字段中。 ASP.NET知道cookie的值没有被篡改的方式是它使用配置中指定的machineKey签名。

在处理安全性和身份验证时,您应遵循一条重要规则:始终使用内置安全机制,永远不要自己动手。