2009-04-12 89 views
9

用于防止URL操作的任何优秀策略,代码片段等?使用MVC防止Url操纵攻击?

例如,我有这个网址,http://localhost/profile/edit/5的ID可以很容易地改变任何东西,因此人们可以编辑他们不应该太型材。

这里有一些想法,我想到了,但他们都没有缺点:

  1. 更改我的系统使用GUID主键 - 使得它几乎不可能猜出键 - 但人们仍然可以采取GUID从应用程序的一部分,稍后在另一个URL中使用它。

  2. 使用TempData存储密钥 - 防止网址在稍后使用\ used 发送。

  3. 在显示页面之前在控制器中执行检查 - 意味着您必须在每个地方执行“管理”代码 以检查操作。

最好的事情是什么?其中之一还是其​​他?

+0

我想补充一点,还有没有像样的方式来做到这一点?也许在EntityFramework? – Worthy7 2016-06-27 01:46:32

回答

17

3号是正确的事情。服务器端安全验证始终是您需要的,因为这是您完全控制并可以依赖的机制。

1号是隐藏的安全,如果有人不小心张贴他的URL的地方(就像人们经常做的会话ID时,他们复制/粘贴链接),你的“安全性”被打破了。

2号似乎是一个弱安全性 - 如果你通过的麻烦,更好地实施适当的安全。这也可以让人们为该页面添加书签。

+0

同意。 MVC默认带有账户创建页面,您可以使用它们! – 2009-04-12 12:06:51

1

用于访问您的网站的URL数据是从客户端,并在有关安全的问题,您应该总是考虑客户端提供的数据敌意。

遗憾的是没有灵丹妙药来解决这个问题。您需要在整个应用程序中实施访问限制。

3

你不应该让你的网址,“防操纵的”保护基本功能。此外:大多数网站使URL更具可读性,例如http://stackoverflow.com/questions/741653/preventing-url-manipulation-attacks-with-mvc - 混淆会倒退一步。

而是检查您的控制器中的权限,并在用户不允许编辑配置文件6时引发异常。如果您不想在任何地方都有“检查”,也许可以将它们放入ActionFilter或创建一些帮助方法,如CurrentUser.FindProfileToEditById(profileId)(如果该操作不被允许,则抛出异常)而不是Profile.FindById(id)

如果你想要一个没有“当前用户”的通用服务,你可以使用GUID(例如Doodle也是如此) - 但是这样做总是会以各种方式造成安全威胁(Facebook有这个问题与他们的相册)。

3

我使用自定义授权过滤器来实现基于角色和所有者的访问控制。标准的AuthorizationFilter将允许您指定可以访问操作的命名角色或用户。我已经扩展了这一点,以允许您指定当前用户可能有权访问它们,如果它们是数据的“所有者”。我有两个额外的过滤器,RoleOrOwnerAuthorizationFilter和RoleOrOwnerAssociatedAuthorizationFilter。第一个检查在RouteData中传递的可配置参数(通常为id)是我用户表中当前用户的ID,或者当前用户是否在任何列出的角色中。如果是,则检查成功,否则返回授权错误视图。

第二个允许我指定一个连接表和参数,用于将RouteData中的参数与连接表中的列关联,将当前用户关联到连接表中的另一列。如果存在与参数值和用户相匹配的条目,则我得出结论:用户与数据相关并且可以访问。如果您处于指定角色,它也允许访问。在三种不同的属性之间,我几乎满足了所有的访问控制需求,这意味着我仅通过使用适当配置的属性进行装饰来应用安全性。