AngularJS身份验证安全性


AngularJS security on authentication

我们正在使用AngularJSPHP开发一个系统。我对身份验证问题的安全性有些担心。我编写了一个基于web上多个不同示例的基本身份验证(我刚开始学习Angular),它通过REST API调用使用数据库。在某些路线上,它会在创建承诺之前检查用户信息是否存在,但我有几个问题:

  • 会话信息可以存储在$window.sessionStorage$cookieStorage中,而客户端不能修改这些值吗?或者我应该用PHP $_SESSION将它们保存在服务器端并从那里获取,而不是将它们存储在JS中的任何位置吗?会话信息可以包含uid、角色、电子邮件和名称

  • 我可以存储一个值吗,比如说$rootScope.role$scope.role,而客户端不能修改这个值?举个例子,我们有多个级别的用户帐户,其中超级管理员是最高的。如果我创建了一个解析为检查$rootScope.role级别的路由,新手可以将$rootScope.role值更改为超级管理员以访问受限的后端部分吗?

  • 我是否必须对每个获取$_SESSION数据的路由执行GET/session检查,以确保这些数据保持不变?

  • 还是我只是多疑?

你不是偏执狂,任何客户端身份验证都应该受到质疑。当涉及到安全性时,您不能假设客户端被禁止或无法在自己的设备上执行任何操作

与安全相关的功能必须保留在后端,即您设置和控制的环境中。

新手可以将$rootScope.role值更改为super-admin以访问受限制的后端部分吗?

"新手能…"这样的问题在我看来是徒劳的。你只想要针对新手恶意用户的安全吗?如果你的"受限后端部分"可以通过修改前端来访问,那么你就做错了。

好问题!前端安全需要浏览器和服务器的配合。

Javascript是一个不受信任的环境,因此您无法在那里可靠地强制执行任何授权(即,您不能使用$scope上的属性来阻止用户执行某些操作)。您的服务器需要通过确保每个API请求都经过正确的身份验证和授权来强制执行这些规则。

API请求通常使用cookie进行身份验证。cookie通常包含一个会话标识符,该标识符指向数据库中的一行,该行包含授权信息(即允许用户访问的内容)。用户可以通过登录(提供用户名和密码等硬凭据)获得此cookie。

cookie还可以包含签名的访问令牌,例如JWT。根据您的体系结构,您可以删除会话数据库,并完全依靠签名的令牌进行身份验证。

在任何一种情况下,当服务器将cookie发送到浏览器时,您都希望在cookie上设置HttpOnly标志。这将阻止JavaScript环境读取cookie,这是针对XSS攻击的一个很好的安全措施。

您还需要保护自己免受CSRF攻击。在这种情况下,另一个网站可以触发对您的API的GET或POST请求,这将与身份验证cookie一起发送。您可以通过创建另一个没有HttpOnly标志的cookie并在其中存储一个随机值来防止这种情况。JS环境必须将该值附加到任何请求,通常作为自定义HTTP标头。然后,服务器断言该值与会话或令牌相关联。

我已经试着在这个答案中涵盖了所有的基础。如果你想阅读更多,你可以看看我写的这些博客文章,它们讨论了令牌身份验证,但每个部分都涵盖了前端安全问题:

基于令牌的单页应用程序(SPAs)认证

https://stormpath.com/blog/build-secure-user-interfaces-using-jwts/

免责声明:我在Stormpath工作,我们为任何应用程序提供安全、托管的用户管理解决方案,包括Angular!看见https://docs.stormpath.com以了解更多信息并查找服务器的SDK。