如何防止AngularJS SPA中的URL泄露?

时间:2017-07-21 15:34:50

标签: angularjs security asp.net-web-api single-page-application

第三方安全咨询公司在信息披露领域的Angular SPA / ASP.NET WebAPI应用程序中发现了风险,我们已经告知要解决此问题。

风险是由于Angular应用程序的性质,其中应用程序界面由客户端javascript驱动,敏感区域的URL可以通过浏览JS来发现。

EG。

// Inside the user-controller.js angular controller
$scope.newRecord = function () {
    $location.url('admin/users/new');
};

他们甚至没有注意到我们的存储库包含了对WebAPI后端端点的所有调用!

// From the user-repository.js angular service
save: function (record) {
   return $resource('api/users').save(record);
}

所有对端点的访问都在WebAPI后端受到保护,未经授权的访问将被拒绝。然而,安全顾问说:

  

虽然较低权限的用户无法导航到这些用户   目录,确认这些页面存在于   应用程序可以促进攻击。

使用服务器端生成的HTML的传统.NET方法是不可能的,因为前端是纯粹的Angular应用程序,除了WebAPI调用之外没有.NET交互,并且与语言无关。我只能想象创建一个新的角度服务,它根据Web访问级别调用WebAPI获取URL字典,但它的工作量很大,而且增加了复杂性。

就个人而言,这似乎有些过分,我担心解决方案需要更多的努力才能有效地管理应用程序的安全性。

问题

在AngularJS应用程序中处理此问题是否有简单且可接受的策略?其他人用来克服这种普遍存在的“漏洞”的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

我假设您授权使用用户角色访问那些具有较高权限的端点,而不是仅通过隐藏它们来保护您的应用程序。

Compartmentalization是一回事。恶意用户将攻击已知端点,如果您不公开API的端点,则可能需要更长时间才能找到这些端点。它与隐藏HTTP服务器版本标头相当。当然,攻击者可能无法立即找出您正在运行的版本,但他们仍会强制执行适用于各种版本的所有已知攻击。

因此,当我质疑隐藏这些端点()的有用性时,解决方案是暴露一个"端点" API,返回所有其他端点的字典:

对于普通用户:

{
    "addresses" : "https://example.com/api/v2/address",
    "orders" : "https://example.com/api/v2/orders"
}

对于角色" accountmanagement"中的用户:

{
    "addresses" : "https://example.com/api/v2/address",
    "orders" : "https://example.com/api/v2/orders",
    "accounts" : "https://example.com/api/v2/accounts"
}

对于管理员:

{
    "addresses" : "https://example.com/api/v2/address",
    "orders" : "https://example.com/api/v2/orders",
    "accounts" : "https://example.com/api/v2/accounts",
    "users" : "https://example.com/api/v2/users"
}

然后从您的JavaScript代码中,在发出API调用时,您可以通过其键查找该端点的相应基本URL("地址","用户",.. 。)构建请求URL,或者在不存在时返回错误。

答案 1 :(得分:-1)

我建议的一个想法是用所有CURD方法创建一个Web api包装器。方法应具有一个参数,其中服务api端点名称为值。您所有的javascript都应调用此方法,该方法位于应用程序的UI层。

您的Web api包装器可以使用服务器端的webClient方法依次调用相应的Web api服务。这样,我们可以完全隐藏Web api URL。

希望这会给您一些想法。