【问题标题】:AngularJS security on authenticationAngularJS 身份验证安全性
【发布时间】:2015-09-15 21:25:31
【问题描述】:

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

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

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

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

  • 还是我只是偏执?

【问题讨论】:

    标签: javascript php angularjs session


    【解决方案1】:

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

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

    新手能否将 $rootScope.role 值更改为超级管理员,以获得对受限后端部分的访问权限?

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

    【讨论】:

    • 感谢您的回答,但是当我谈到新手时,您误解了我。我指的不是用户技能级别,而是用户帐户级别。我会接受你的回答并相应地调整我的代码。
    【解决方案2】:

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

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

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

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

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

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

    我已尝试涵盖此答案中的所有基础。如果您想了解更多信息,可以查看我写的这些博客文章,它们讨论了令牌身份验证,但每个部分都有涉及前端安全问题的部分:

    Token Based Authentication for Single Page Apps (SPAs)

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

    免责声明:我在 Stormpath 工作,我们为任何应用程序(包括 Angular)提供安全的托管用户管理解决方案!请参阅https://docs.stormpath.com 了解更多信息并找到适用于您服务器的 SDK。

    【讨论】:

    • 该系统的 JWT 方法可能有点过多,因为我们所有的数据都与用户的 id 相关,但我们可能会为了实践和未来的使用而实现它。基于令牌的身份验证确实对 PHP 隐藏的基本会话或 cookie 有其他好处,因此值得考虑。不过,我们将忘记在此笔记中存储 JavaScript。谢谢!
    猜你喜欢
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-19
    • 1970-01-01
    • 2023-03-31
    • 2019-03-13
    • 2011-09-24
    相关资源
    最近更新 更多