第三方安全咨询公司在信息披露领域的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应用程序中处理此问题是否有简单且可接受的策略?其他人用来克服这种普遍存在的“漏洞”的最佳方法是什么?
答案 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。
希望这会给您一些想法。