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

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

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

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

例如。

// 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 后端得到保护,未经授权的访问将被拒绝。然而,安全顾问说:

Whilst lower privilege users would not be able to navigate to these directories, the confirmation that these pages existed within the application could facilitate attacks.



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

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

问题

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

最佳答案

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

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

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

对于普通用户:

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

对于 Angular 色“帐户管理”中的用户:
{
    "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,或者在以下情况下返回错误不存在。

关于angularjs - 如何防止 AngularJS SPA 中的 URL 泄露?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45241548/

相关文章:

c# - 当属性不为空时使用 FluentValidation 检查电子邮件有效性

angularjs - 在 AngularJS 中访问 Spring MVC 模型对象

javascript - AngularJS:将服务注入(inject)指令?

java - Android Keystore getEntry() 和 generateKeyPair() 有时会抛出异常

javascript - jquery $ ('div' .html 不适用于第三方模块( Angular )

java - 使用外部机器的 URL 和端口打开 Socket 来播放流音频的安全问题

javascript - WebRTC 和安全 - 拦截连接?

c# - 使用 Autofac 聚合服务来共享依赖项

file-upload - 使用 MVC4 Web-API 的文件上传表单:获取错误 101 (net::ERR_CONNECTION_RESET):连接已重置。错误

asp.net - RouteTable.Routes 和 HttpConfiguration.Routes 的区别?