Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.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
Javascript 基于身份验证的AngularJS安全_Javascript_Php_Angularjs_Session - Fatal编程技术网

Javascript 基于身份验证的AngularJS安全

Javascript 基于身份验证的AngularJS安全,javascript,php,angularjs,session,Javascript,Php,Angularjs,Session,我们正在使用AngularJS和PHP开发一个系统。我对认证问题的安全性有些担忧。我编写了一个基于web上多个不同示例的基本身份验证(我只是开始学习Angular),它通过RESTAPI调用使用数据库。在某些路由上,它会在创建承诺之前检查用户信息是否存在,但我有几个问题: 会话信息是否可以存储在$window.sessionStorage或$cookieStorage中,而客户端无法修改这些值,或者我是否应该使用PHP$\u session将它们保存在服务器端,并从那里获取它们,永远不要将它们

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

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

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

  • 我是否必须对获取会话数据的每个路由执行GET/session检查,以确保该数据保持不变

  • 还是我只是偏执狂


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

      与安全相关的功能必须位于后端,即您设置和控制的环境

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


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

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

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

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

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

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

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

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


      免责声明:我在工作,我们为任何应用程序提供安全的托管用户管理解决方案,包括Angular!请参阅以了解更多信息,并查找服务器的SDK。

      谢谢您的回答,但当我谈到新手时,您误解了我的意思。我指的不是用户技能级别,而是用户帐户级别。我会接受你的回答,并相应地调整我的代码。这个系统的JWT方法可能有点太多,因为我们所有的数据都与用户的id有关,但我们可能会为了实践和未来的使用而实现它。基于令牌的身份验证对PHP上的基本会话或cookie有其他好处,因此值得考虑。不过,我们将忘记在本说明中存储JavaScript。谢谢