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



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

风险是由于 Angular 应用程序的性质,其中应用程序接口由客户端 javascript 驱动,并且可以通过查看 JS 来发现敏感区域的 URL。

例如。

// 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交互,并且与语言无关。我只能想象创建一个新的角度服务,该服务根据访问级别为URL字典调用WebAPI,但这需要大量工作并增加复杂性。

就个人而言,这似乎是矫枉过正,我担心解决方案需要付出更多的努力,因为我们已经有效地管理了应用程序的安全性。

问题

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

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

划分是一回事。恶意用户将攻击已知终结点,如果不公开 API 的终结点,它们可能需要更长的时间才能找到这些终结点。这相当于隐藏HTTP服务器版本标头。当然,攻击者可能不会立即找出您正在运行的版本,但无论如何他们都会暴力破解适用于各种版本的所有已知攻击。

因此,虽然我质疑隐藏这些端点((的有用性,但解决方案是公开一个"端点"API,它返回所有其他端点的字典:

对于普通用户:

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

对于角色为"帐户管理"的用户:

{
"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,或者在不存在时返回错误。

我建议的一个想法是创建一个包含所有 CURD 方法的 Web API 包装器。 方法应具有一个参数,其中的服务 API 终结点名称作为值。所有 JavaScript 都应该调用此方法,该方法驻留在应用程序的 UI 层中。

Web API包装器可以使用服务器端的 WebClient 方法反过来调用相应的 Web API 服务。这样,我们可以完全隐藏 Web API URL。

希望这会给你一些想法。

最新更新