我使用此视图编辑现有对象:
@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();
}
所以,我正在寻找一种方法来保护我免受这个问题的影响。
答案 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应用程序中都很常见。有一些方法有不同的权衡。
ViewBag
和TempData
是特定类型的会话数据。您需要从显示编辑页面到处理它的操作持续的东西。我相信TempData
是为此目的而设计的,但需要仔细检查。可能有其他相当复杂的方式涉及JSON序列化和代码混淆,但您可以做的最好的事情是永远不要相信来自浏览器的数据的面值。
将会话数据中的隐藏字段与经过身份验证的交互相结合,您可以将隐藏字段值与会话值进行比较,如果它们不匹配,则标记用户帐户。如果你自己引入JavaScript来做这些修改,请小心。
答案 2 :(得分:1)
简单的答案是授权访问编辑,这是你应该做的事情。
每当您获得POST时,请运行相同的授权码,以确保此人能够查看该项目。如果他们不这样做,那就是403。
这样的HTTP确实不是特别“安全”,因为它是无状态的。你不能假设某人不会改变事物。更糟糕的是,有人可以打开cURL或Fiddler并直接向您发送请求,甚至不必使用开发工具。
最佳做法是始终重新检查身份验证(您的框架可能会为您做的事情)以及对每个请求的授权,无论是查看还是编辑请求。
当然,如果您正在使用基于角色的授权(例如,使用Authorize
属性),MVC将为您处理所有这些。
答案 3 :(得分:1)
另一种方法是散列IdNumPart的值并将其作为第二个隐藏字段发送。您应该使用某种服务器密钥对其进行哈希处理。在回发后,第二个字段的哈希值必须与IdNumPart匹配。如果任何人更改了哈希或IdNumPart中的一个字符,您将知道并且您应该拒绝更改。另一个建议是,永远不要从互联网上的某个人那里得到一个安全建议,从他的头脑中提出安全解决方案。