用户在View中修改模型的隐藏值(@ Html.HiddenFor)

时间:2015-12-28 20:28:56

标签: c# asp.net-mvc

我使用此视图编辑现有对象:

@using (Html.BeginForm("EditPat","bff"))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)
    @Html.HiddenFor(m => m.IdNumPart)
    ...more code

实际上,普通用户看不到IdNumPart字段,但如果他们使用Chrome DevTools,他们可以修改隐藏值:

<input data-val="true" data-val-number="The field IdNumPart must be a number." data-val-required="The IdNumPart field is required." id="IdNumPart" name="IdNumPart" type="hidden" value="13">

当他们提交会影响我的控制器中的逻辑时,他们可以修改任何记录,更改 IdNumPart

[HttpPost]
public ActionResult EditPat(inspListaNoParte model)
{
    try
    {
        var oldModel = bff.inspListaNoPartes.Find(model.IdNumPart);
        bff.Entry(oldModel).State = EntityState.Modified;
        oldModel.UMC = model.UMC;
        bff.SaveChanges();
        TempData["AlertMessage"] = "Success";
    }
    catch (Exception ex)
    {
        TempData["ErrorMessage"] = "Error";
        throw;
    }
    return View();
}

所以,我正在寻找一种方法来保护我免受这个问题的影响。

4 个答案:

答案 0 :(得分:2)

您可以使用属性禁止访问某些用户的方法

[HttpPost]
[Authorize(Roles = "Administrator,Editors")]
public ActionResult EditPat(inspListaNoParte model)
{
    try
    {
        var oldModel = bff.inspListaNoPartes.Find(model.IdNumPart);
        bff.Entry(oldModel).State = EntityState.Modified;
        oldModel.UMC = model.UMC;
        bff.SaveChanges();
        TempData["AlertMessage"] = "Success";
    }
    catch (Exception ex)
    {
        TempData["ErrorMessage"] = "Error";
        throw;
    }
    return View();
}

或者您可以使用方法

检查用户是否在组内
if(User.IsInRole("Administrator"))

并在db表中添加字段&#34; ModifiedBy&#34;所以你可以知道谁是修改记录的最后一个人。

oldModel.LastModifiedBy= WebSecurity.CurrentUserId;

如果用户有权访问某些产品的编辑模式,那么只需检查该产品是否属于他

if(oldModel.OwnerId == WebSercurity.CurrentUserId)

我希望这会有所帮助。

答案 1 :(得分:2)

这种困境在所有Web应用程序中都很常见。有一些方法有不同的权衡。

  • 强制对任何编辑进行身份验证(良好做法)。这并不能解决问题,但至少你有一个谁是坏演员的记录,你可以禁用他们的帐户。 (其他答案有更多细节)
  • 将隐藏字段保留在某种形式的会话存储中。优点是客户端中唯一的信息是会话ID。会话ID用于恢复用户的信息。您必须自己重新组装记录,并处理信息不会存在的可能性,因为用户更改了存储在cookie中的会话ID。注意:ViewBagTempData是特定类型的会话数据。您需要从显示编辑页面到处理它的操作持续的东西。我相信TempData是为此目的而设计的,但需要仔细检查。

可能有其他相当复杂的方式涉及JSON序列化和代码混淆,但您可以做的最好的事情是永远不要相信来自浏览器的数据的面值。

将会话数据中的隐藏字段与经过身份验证的交互相结合,您可以将隐藏字段值与会话值进行比较,如果它们不匹配,则标记用户帐户。如果你自己引入JavaScript来做这些修改,请小心。

答案 2 :(得分:1)

简单的答案是授权访问编辑,这是你应该做的事情。

每当您获得POST时,请运行相同的授权码,以确保此人能够查看该项目。如果他们不这样做,那就是403。

这样的HTTP确实不是特别“安全”,因为它是无状态的。你不能假设某人不会改变事物。更糟糕的是,有人可以打开cURL或Fiddler并直接向您发送请求,甚至不必使用开发工具。

最佳做法是始终重新检查身份验证(您的框架可能会为您做的事情)以及对每个请求的授权,无论是查看还是编辑请求。

当然,如果您正在使用基于角色的授权(例如,使用Authorize属性),MVC将为您处理所有这些。

答案 3 :(得分:1)

另一种方法是散列IdNumPart的值并将其作为第二个隐藏字段发送。您应该使用某种服务器密钥对其进行哈希处理。在回发后,第二个字段的哈希值必须与IdNumPart匹配。如果任何人更改了哈希或IdNumPart中的一个字符,您将知道并且您应该拒绝更改。另一个建议是,永远不要从互联网上的某个人那里得到一个安全建议,从他的头脑中提出安全解决方案。