Asp.net mvc 使用MVC防止Url操纵攻击?

Asp.net mvc 使用MVC防止Url操纵攻击?,asp.net-mvc,security,url,Asp.net Mvc,Security,Url,有没有防止URL操纵的好策略、代码片段等 例如,我有一个url,http://localhost/profile/edit/5id可以很容易地更改为任何内容,因此人们可以编辑不需要的个人资料 以下是我想到的一些想法,但它们都有缺点: 将我的系统更改为使用GUID主键-这几乎不可能猜出键-但人们仍然可以从应用程序的一个部分获取GUID,稍后在另一个url中使用它 使用TempData存储密钥-防止到处发送URL\used 稍后 在显示页面之前在控制器中执行检查-表示您 到处都要做“管理员”代码 检

有没有防止URL操纵的好策略、代码片段等

例如,我有一个url,
http://localhost/profile/edit/5
id可以很容易地更改为任何内容,因此人们可以编辑不需要的个人资料

以下是我想到的一些想法,但它们都有缺点:

  • 将我的系统更改为使用GUID主键-这几乎不可能猜出键-但人们仍然可以从应用程序的一个部分获取GUID,稍后在另一个url中使用它

  • 使用TempData存储密钥-防止到处发送URL\used 稍后

  • 在显示页面之前在控制器中执行检查-表示您 到处都要做“管理员”代码 检查操作


  • 最好的办法是什么?其中一个或其他什么?

    第三个是正确的做法。服务器端安全验证始终是您需要的,因为这是您完全可以控制和依赖的机制

    第一是隐蔽性的安全性,如果有人不小心在某处发布了他的URL(就像人们在复制/粘贴链接时经常使用会话ID一样),您的“安全性”就被破坏了


    第2个似乎是一个薄弱的安全性-如果你经历了麻烦,最好实现适当的安全性。这也允许人们对页面进行书签。

    用于访问站点的URL是来自客户端的数据,当涉及安全性时,应始终考虑客户端提供的数据敌对。


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

    您不应该让URL“防操作”以保护底层功能。此外:大多数网站使URL更具可读性,如
    http://stackoverflow.com/questions/741653/preventing-url-manipulation-attacks-with-mvc
    例如,模糊处理将是一种倒退

    而是检查控制器内的权限,如果不允许用户编辑配置文件6,则引发异常。如果您不想让“检查”无处不在,那么您可以将它们放入
    ActionFilter
    ,或者创建一些助手方法,比如
    CurrentUser.FindProfileToEditById(profileId)
    (如果不允许该操作,则会引发异常),而不是
    Profile.FindById(id)


    如果您想要一个没有“当前用户”的通用服务,您可以使用GUID(例如Doodle),但是这在各种方面都是一个安全威胁(Facebook的相册有这个问题)。

    我使用自定义授权过滤器来实现基于角色和所有者的访问控制。标准AuthorizationFilter将允许您指定可以访问操作的命名角色或用户。我对其进行了扩展,允许您指定如果当前用户是数据的“所有者”,则他们可能具有访问权限。我有两个额外的过滤器,RoleRowGeneratedAuthorizationFilter和RoleRowGeneratedAssociatedAuthorizationFilter。第一个检查RoutedData中传递的可配置参数(通常为
    id
    )是否为my users表中当前用户的id,或者当前用户是否处于所列角色中。如果检查成功,则返回授权错误视图


    第二种方法允许我指定联接表和参数,用于将RouteData中的参数与联接表中的列以及当前用户与联接表中的另一列关联。如果有一个条目同时匹配参数值和用户,那么我认为用户与数据相关,可以访问。如果您处于指定角色,它还允许访问。在这三个不同的属性之间,我几乎满足了我所有的访问控制需求,这意味着我只需使用一个适当配置的属性进行装饰即可应用安全性。

    同意。MVC默认带有帐户创建页面,您也可以使用它们!通过实现允许您将安全性作为一个方面应用于不同控制器/操作的属性,您可以使(3)变得更容易。查看我对这个问题的回答,了解更多关于我是如何做到这一点的信息。我想补充一点,现在还没有合适的方法来做到这一点吗?也许在实体框架中?