【问题标题】:AngularJS - How to make a token inaccessible from console or malicious attacks?AngularJS - 如何使控制台或恶意攻击无法访问令牌?
【发布时间】:2015-07-12 15:52:31
【问题描述】:

我想在客户端存储一个令牌,但我担心客户端浏览器受到恶意攻击。

在会话期间存储此变量的最佳方式是什么?

到目前为止,这是我的暗示:

在“HeadersInterceptor”函数中创建一个隔离范围,以便只有该函数可以访问它。

在客户端存储存储此变量的最佳方式是什么?

到目前为止,这是我的暗示:

本地存储...

我确实觉得我正在朝着正确的方向前进,但我很难为客户存储这个变量。任何见解将不胜感激!

【问题讨论】:

  • 如果您不希望它对客户端可用,请不要将其公开。
  • 我必须让客户端可以在每个 $http 请求休息 API 服务器期间使用它。公共是什么意思,比如公共变量?
  • 不公开我的意思是不要把它提供给客户。
  • 我认为最好的方法是加密它。这是真正隐藏数据免受恶意攻击的唯一方法。在服务器端,您可以使用解密算法来处理每个请求。但在客户端存储时,请务必使用加密。
  • @RohitKumar 但在这种情况下,我只会窃取并使用加密令牌

标签: javascript angularjs security xss token


【解决方案1】:

你不能。

任何可以从您的 JS 应用程序访问的内容也可以从开发人员控制台访问,这就是客户端脚本的本质。

正如其他答案所暗示的那样,将其隐藏在私有变量或服务中只不过是一种混淆——它会让它变得更加令人讨厌,但它仍然存在并且可用。

即使您找到了一种使其无法直接从开发者控制台访问的方法,恶意用户仍然可以自己修改 JS 文件 - 这是一场失败的战斗。

【讨论】:

  • 我不担心有人拿到文件。我担心用户使用有效令牌登录,而攻击者通过 XSS 从客户端获取该令牌
  • @RobLaverty 为什么在 OP 中没有提到呢?:) 没有针对 XSS 的 token-specific 保护,您应该使用通用的 XSS 预防模式,不管是什么你试图保护。一旦允许恶意脚本运行,令牌在任何地方都不安全。
【解决方案2】:

我对此的看法:

在会话期间存储此变量的最佳方式是什么?

sessionStorage

将此变量存储在客户端存储上的最佳方式是什么?

会话存储

但是,如果您根本不希望它可以访问,即使是从控制台(sessionStorage 和 localStorage 可以从控制台访问),我认为您应该放弃将它存储在 LS 中,而只是在内存中保存一个引用。将令牌私下包裹在闭包中,并通过服务访问它。像这样:

app.factory('tokenSvc', function(){
    var token;

    return {

        setToken: function(_token) {
            token = _token;
        },

        getToken: function() {
            return token;
        }
    };

});

因为 Angular 是一个 SPA 框架,所以只要您的应用程序处于活动状态,token 引用就会一直存在。所以也许你会在你的 $http 拦截器函数中设置令牌,然后根据需要通过getToken 访问它。

【讨论】:

  • 通过观察http请求获取token还是很简单的。
  • 我在这里所做的是在 app.run 调用 $http req 并带有一个故意错误,该错误被捕获并获取令牌。然后使用你在这里的这个工厂想法获取和设置。谢谢ccnokes!
猜你喜欢
  • 2017-04-12
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 2021-05-04
  • 2018-10-12
  • 2016-11-05
  • 1970-01-01
  • 2020-11-23
相关资源
最近更新 更多