有什么好的策略,代码片段等可以防止URL操作?
例如,我有这个网址,http://localhost/profile/edit/5
可以很容易地将ID更改为任何内容,因此人们可以编辑不应该使用的配置文件。
以下是我想到的一些想法,但它们都有缺点:
将我的系统更改为使用GUID主键 - 几乎不可能猜出键 - 但是人们仍然可以从应用程序的某个部分获取GUID,然后在另一个URL中使用它。
使用TempData存储密钥 - 防止在\ used周围发送网址 后面。
在显示页面之前在控制器中执行检查 - 意味着您 必须到处都做“管理”代码 检查操作。
什么是最好的事情?其中一个还是别的什么?
答案 0 :(得分:17)
3号是正确的做法。服务器端安全验证始终是您所需要的,因为这是您完全控制并可依赖的机制。
第1号是Obscurity的安全性,如果有人不小心在某处发布了他的网址(就像人们在复制/粘贴链接时经常使用会话ID一样),您的“安全性”就会被破坏。
2号似乎是一个弱安全性 - 如果你经历麻烦,更好地实施适当的安全性。这也允许人们为页面添加书签。
答案 1 :(得分:3)
您不应将您的网址“防操纵”以保护基础功能。此外:大多数网站使URL更具可读性,例如http://stackoverflow.com/questions/741653/preventing-url-manipulation-attacks-with-mvc
- 混淆将是倒退。
而是检查控制器中的权限,如果不允许用户编辑配置文件6则引发异常。如果您不想在任何地方进行“检查”,也许您可以将它们放入{{1}或者创建一些帮助器方法,如ActionFilter
(如果不允许该操作则抛出异常),而不是CurrentUser.FindProfileToEditById(profileId)
。
如果你想要一个你没有“当前用户”的通用服务,你可能会使用GUID(例如Doodle也是如此) - 但是这会以各种方式成为安全威胁(Facebook有这个问题)和他们的相册)。
答案 2 :(得分:3)
我使用自定义授权过滤器来实现基于角色和所有者的访问控制。标准AuthorizationFilter将允许您指定可以访问操作的命名角色或用户。我已将其扩展为允许您指定当前用户可能具有访问权限,如果他们是数据的“所有者”。我有两个额外的过滤器,RoleOrOwnerAuthorizationFilter和RoleOrOwnerAssociatedAuthorizationFilter。第一个检查在RouteData中传递的可配置参数(通常为id
)是我的users表中当前用户的id,或者当前用户是否处于任何列出的角色中。如果是,则检查成功,否则返回授权错误视图。
第二个允许我指定一个连接表和用于将RouteData中的参数与连接表中的列和当前用户连接到连接表中另一列的参数。如果存在与参数值和用户匹配的条目,则我得出结论:用户与数据相关并且可以具有访问权限。如果您处于指定角色,它还允许访问。在三个不同的属性之间,我几乎满足了所有的访问控制需求,这意味着我只需通过使用适当配置的属性进行装饰来应用安全性。
答案 3 :(得分:1)
用于访问您网站的网址是来自客户端的数据,当涉及安全性时,您应始终将客户提供的数据视为敌意。
不幸的是,没有银子弹可以解决这个问题。您需要在整个应用程序中实施访问限制。