【发布时间】:2011-11-25 19:50:30
【问题描述】:
我正在使用隐藏的表单域来存储用户正在编辑的当前记录。如何防止用户更改该字段? MVC3 的防伪助手会起作用吗,还是我需要自己进行检查?
【问题讨论】:
标签: .net asp.net-mvc-3 security hidden-field
我正在使用隐藏的表单域来存储用户正在编辑的当前记录。如何防止用户更改该字段? MVC3 的防伪助手会起作用吗,还是我需要自己进行检查?
【问题讨论】:
标签: .net asp.net-mvc-3 security hidden-field
与其尝试检查用户是否更改了任何内容,不如检查他们是否被允许编辑提交的 ID 所指示的任何记录。
如果允许他们编辑相关 ID,请让他们这样做。如果没有,不要。甚至不用担心他们是否更改了表单数据,这很简单。
那么防伪令牌实际上并没有任何用途,顺便说一句。
【讨论】:
见How to detect if form field has changed without using hidden field
建议使用散列并在回发时进行比较以检查是否进行了更改。
【讨论】:
看来我误解了你的问题,抱歉。 事实上,AntiForgeryToken 不会帮助您防止这种情况发生。 您可以将这些不可编辑的信息存储在您的模型中(在我的示例中为 Account 类)而不暴露它或在您的会话中。您还可以在模型的属性中添加一些检查/事件引发来检测不需要的版本。
可以使用HtmlHelper方法HtmlHelper.AntiForgeryToken
1/以你的形式:
@using (Html.BeginForm("Edit", "User", FormMethod.Post))
{
@Html.ValidationSummary(true)
<fieldset>
<legend>Account</legend>
<div class="editor-label">
@Html.LabelFor(model => model.FirstName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.FirstName)
@Html.ValidationMessageFor(model => model.FirstName)
</div>
//Your other fields
<p>
@Html.AntiForgeryToken()
<input type="submit" value="Create" />
</p>
</fieldset>
}
2/ 在您的 Post 操作方法中:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Models.Account account)
请注意,AntiForgeryToken 仅适用于 POST 请求,并且必须(显然)启用 cookie :)。
【讨论】:
为了防止 CSRF 攻击,您可以在表单部分使用 Html.AntiForgeryToken 辅助方法
【讨论】: