2010-05-15 44 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