【问题标题】:Detect that a hidden form field has changed?检测到隐藏的表单字段已更改?
【发布时间】:2011-11-25 19:50:30
【问题描述】:

我正在使用隐藏的表单域来存储用户正在编辑的当前记录。如何防止用户更改该字段? MVC3 的防伪助手会起作用吗,还是我需要自己进行检查?

【问题讨论】:

    标签: .net asp.net-mvc-3 security hidden-field


    【解决方案1】:

    与其尝试检查用户是否更改了任何内容,不如检查他们是否被允许编辑提交的 ID 所指示的任何记录。

    如果允许他们编辑相关 ID,请让他们这样做。如果没有,不要。甚至不用担心他们是否更改了表单数据,这很简单。

    那么防伪令牌实际上并没有任何用途,顺便说一句。

    【讨论】:

      【解决方案2】:

      How to detect if form field has changed without using hidden field

      建议使用散列并在回发时进行比较以检查是否进行了更改。

      【讨论】:

      • 答案提到将其存储在视图模型中。那是指 ViewBag 吗?
      • 由于 MVC 的工作方式,ViewBag 只会在页面的生命周期中存在。您可以将视图模型写入页面(作为隐藏字段)。您可以将字段写入会话(虽然有点混乱)。
      【解决方案3】:

      编辑

      看来我误解了你的问题,抱歉。 事实上,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 :)。

      【讨论】:

      • 我知道防伪助手。问题是助手是否有助于防止篡改隐藏的表单字段?
      • 确实,我的错,我应该再读几遍你的问题:)!刚刚编辑了我的答案。
      【解决方案4】:

      为了防止 CSRF 攻击,您可以在表单部分使用 Html.AntiForgeryToken 辅助方法

      【讨论】:

      • 这个问题与csrf攻击无关。
      猜你喜欢
      • 2013-09-22
      • 1970-01-01
      • 2011-10-15
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多