Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止AngularJS SPA中的URL泄露?_Angularjs_Security_Asp.net Web Api_Single Page Application - Fatal编程技术网

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

如何防止AngularJS SPA中的URL泄露?,angularjs,security,asp.net-web-api,single-page-application,Angularjs,Security,Asp.net Web Api,Single Page Application,一家第三方安全顾问在我们的Angular SPA/ASP.NET WebAPI应用程序中发现了信息披露方面的风险,我们被告知要解决该风险 风险源于角度应用程序的性质,其中应用程序接口由客户端javascript驱动,通过查看JS可以发现敏感区域的URL 例如 他们甚至没有注意到我们的存储库包含对WebAPI后端端点的所有调用 // From the user-repository.js angular service save: function (record) { return $re

一家第三方安全顾问在我们的Angular SPA/ASP.NET WebAPI应用程序中发现了信息披露方面的风险,我们被告知要解决该风险

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

例如

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

// From the user-repository.js angular service
save: function (record) {
   return $resource('api/users').save(record);
}
对端点的所有访问都在WebAPI后端进行保护,未经授权的访问将被拒绝。然而,安全咨询公司表示:

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

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

就个人而言,这似乎有些过分,我担心解决方案需要付出的努力会超出其价值,因为我们已经有效地管理了应用程序的安全性

问题


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

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

这是一件事。恶意用户将攻击已知的端点,如果您不公开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",
    "users" : "https://example.com/api/v2/users"
}

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

我建议的一个想法是创建一个包含所有CURD方法的webapi包装器。方法应具有一个参数,该参数的值为ServiceAPI端点名称。所有javascript都应该调用这个方法,它驻留在应用程序的UI层中

您的web api包装器可以使用服务器端的webClient方法内部调用相应的web api服务。这样我们就可以完全隐藏web api URL


希望这能给你一些想法。

对我来说,这听起来像是一个愚蠢的审计。他们希望您做什么,生成每个用户角色的JS代码来隐藏那些用户无论如何都无法访问的URL?他们在倡导什么,通过默默无闻实现安全?但我不是安全专家,所以我可能遗漏了什么。我基本上会称安全顾问公司不称职。他们与行业现状脱节。我还将迫使他们根据所谓的脆弱性证明一次成功的攻击。对我来说,这听起来像一群白痴,他们拿着一张90年代的清单。我很惊讶他们没有声称JavaScript本身存在安全风险。听到其他人分享我的观点,我感到非常欣慰。我本不想说清楚,但我觉得这也很可笑。这就是生活就像为政府编写软件,所有软件都必须通过这些与软件无关的检查表(这只是半打愚蠢问题中的一个,但其他问题我至少可以轻松解决)。我会看看是否有安全大师有一些智能解决方案,否则我会向他们报告,努力与收获是不值得的。@CodeCaster这是我对他们期望的,基于访问级别生成URL。我也不是安全专家。希望有一位安全专家(具有软件理解能力)在那里,能够启发我们或击落这一切。这就是我想象中的做法。我很好奇是否有其他公认的方法来处理这个问题。我意识到这个解决方案并没有隐藏顾问指出的angularJS路线参考。事实上,angularJS路由都在应用程序js文件中(根据标准angular实践),因此我们不能隐藏这些路由,除非我们彻底改变路由在客户端上的工作方式。所以这不能满足他们的发现(但我同意API“端点”是更重要的安全保护)。我不同意这一发现,因为满足这一要求所需的更改级别将是在不同的平台上一起重写。
{
    "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"
}