ASP.NET MVC:验证是否允许编辑记录(所有权)

4
我有一个多用户的ASP.NET MVC应用程序。用户不能看到或处理其他用户的数据。
我的一个控制器操作是强制性的POST到/Edit来编辑记录(例如联系人)。现在问题来了:如果有人伪造一个简单的POST到/Edit(它会自动绑定到我的联系人类),并编辑其他人的信息怎么办?由于每个记录都是通过Id标识的,所以唯一需要做的就是用Id XXX创建一个虚假的POST,然后记录#XXX将被覆盖为攻击者提供的任何内容。我该如何阻止这种情况发生?
我想到的唯一方法是每次从数据库中先获取原始实例,检查它是否确实在用户可编辑对象的范围内(他通常会看到要编辑的对象),只有在检查通过后才进行UpdateModel和提交更新更改。
有更好的方法吗?
编辑:这不是跨站点/ CSRF攻击。另一个已登录的用户可以这样做。
4个回答

4

查看/页面授权和特定对象授权是两个不同的概念。最佳方法是使用Authorize属性与ASP.NET角色系统结合使用,以授予或拒绝对给定页面的访问权限。一旦您已经验证了用户可以访问该页面,那么您可以验证他是否有权在请求的对象上请求所需的权限。我在我的应用程序中使用这种方法,它非常有效。通过首先使用Authorize过滤器,它显着提高了性能,因为实际对象权限检查是更重型的操作。

另外,我使用自制的规则系统来设置和确定用户是否有权访问该对象。例如,在我的系统中,管理员对每个对象都具有完全访问权限(这是一个规则)。创建对象的用户对该对象具有完全访问权限(也由规则指定)。此外,用户的经理对其员工可以访问的所有内容都具有完全访问权限(同样由规则指定)。然后,我的应用程序评估对象以查看是否适用任何规则-首先从最简单的规则开始,然后再依次进行更复杂的规则。如果任何规则是正面的,我将停止规则评估并退出函数。


1
你可以使用以下语法在模型绑定中排除ID:

What you could do is exclude the ID in the model binding with this syntax:

 public ActionResult Edit([Bind(Exclude="Id")] User userToEdit)

然后从当前已登录的用户中获取ID,以便只有已登录的用户才能编辑自己的项目,而不是别人的。


虽然您可能还希望有一个管理员可以进入并修改所有用户的详细信息。 - Zhaph - Ben Duguid

0

这个问题让我想起了一篇类似的文章(关于 URL 操纵攻击),我曾经收藏过。它们处理的是一个已认证用户操纵另一个用户的数据的问题。你可能会觉得它很有用: 链接文本

编辑:这个链接应该是正确的: 防止 URL 操纵攻击


修复了上面的链接。 - Jamie M

0

对我来说,首先加载原始记录并检查所有者听起来是一个不错的方法。或者,您可以添加一个包含记录ID的隐藏字段,并对该字段进行加密签名,以确保它不能被更改,或者使用用户ID作为盐值对记录ID进行哈希处理并检查它(假设您正在使用成员资格提供程序,应使用提供程序唯一ID而不是登录名)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接