【发布时间】:2017-04-21 19:56:16
【问题描述】:
显然我继承了一个严重的安全问题。
用户可以登录并在此 URL
https://ourdomain.com/User/Index
但问题是用户可以放入
https://ourdomain.com/User/Edit/16642 and have ACCESS
解决这个问题的简单方法是什么?
【问题讨论】:
标签: asp.net angularjs asp.net-mvc security
显然我继承了一个严重的安全问题。
用户可以登录并在此 URL
https://ourdomain.com/User/Index
但问题是用户可以放入
https://ourdomain.com/User/Edit/16642 and have ACCESS
解决这个问题的简单方法是什么?
【问题讨论】:
标签: asp.net angularjs asp.net-mvc security
这是一个有时被称为“强制浏览”的漏洞。 对您的问题的简短回答是没有简单的方法。您必须实施授权,而将其改装到现有应用程序中会很痛苦。
首先,您需要身份验证(即用户能够安全登录)。我想这或多或少已经完成了,否则 ~/User/Index 将毫无意义。 (顺便说一句,如果站点中存在这样的漏洞,您可能也应该查看身份验证,但是如果使用了诸如表单身份验证之类的标准东西,那么这更容易正确。)
然后你需要授权,可能在两个不同的级别。对于每个调用(即 MVC 中的控制器操作),您需要决定是否允许登录用户进行调用。在 .Net MVC 中,实现这一点的相对简单的方法是 Membership 和 Authorize attribute。
然后根据功能,您可能还需要细粒度的授权。例如,如果您的应用程序存储了分配给特定用户的书籍列表,而其他用户无权访问,则应用程序需要根据登录用户 和来决定是否可以满足 ~/ShowList/123 请求> id=123 的特定列表(仅仅说登录用户可以调用 ~/ShowList 是不够的,因为它取决于哪一个)。这在 Microsoft 术语中称为基于资源的授权,并在 here 进行了讨论。如果您在同一类型的主题(用户)和对象(书单)之间没有这种区别,您可能根本不需要这个。
如果您继承的应用程序很大,实现这些都是痛苦的,但不幸的是,确实没有非常简单的捷径。你可以用不同的方式做,但任何比这少得多的工作都可能有缺陷,除非你的用例非常具体。
另外请注意,Angular 与此没有太大关系。所有的授权都必须在服务端实现,否则没用。
【讨论】: