代码之家  ›  专栏  ›  技术社区  ›  benji

是否可以保护某些对象不受同一页中运行的某些javascript的影响?

  •  0
  • benji  · 技术社区  · 7 年前

    如果攻击者成功地在页面上运行某些Javascript代码,他是否有权访问内存中的所有Javascript对象?

    例如,如果攻击者的代码运行,然后我们使用AJAX请求接收JWT令牌。有没有办法在JWT令牌上保留一个句柄,以便攻击者无法读取它?

    请考虑以下代码:

    (function (window) {
      'use strict';
    
      function MyLib() {
        var _MyLibObject = {}
    
        _MyLibObject.retrieveJWTToken = function() {
          _MyLibObject.jwtToken = "blabla"
        }
    
        return _MyLibObject;
      }
    
      if (typeof (window.MyLib) === 'undefined') {
        window.MyLib = MyLib;
      }
    })(window);
    

    调用retrieveJWTToken()后:

    var lib = MyLib();
    lib.retrieveJWTToken()
    

    可以通过执行以下操作轻松访问JWT令牌:

    lib.jwtToken
    

    有没有什么方法可以设计成这个变量只能由MyLib读取以避免XSS使用它?

    1 回复  |  直到 7 年前
        1
  •  1
  •   t.niese    7 年前

    如果攻击者成功地在页面上运行某些Javascript代码,他是否有权访问内存中的所有Javascript对象?

    只要没有旁道攻击,攻击者就只能读取脚本可以访问的范围内的变量。

    您可以创建只可用于类/对象的变量,例如 WeakMap :

    (function (window) {
      'use strict';
    
      var tokenList = new WeakMap()
      function MyLib() {
        var _MyLibObject = {}
    
        _MyLibObject.retrieveJWTToken = function() {
          tokenList.set(this, "blabla");
          console.log(tokenList.get(this))
        }
    
        return _MyLibObject;
      }
    
      if (typeof (window.MyLib) === 'undefined') {
        window.MyLib = MyLib;
      }
    })(window);
    
    var lib = MyLib()
    lib.retrieveJWTToken()

    但是如果您使用AJAX请求该令牌,那么问题就不是保护变量,而是保护请求,这样恶意脚本就无法拦截该请求。

    它们可以覆盖与使用ajax发送或获取数据相关的所有函数。并获取关键数据。

    打包脚本可能会有更大的问题,因为根据它们的配置,它们允许以后加载某些脚本,并且这些脚本可能会被滥用。

    首先,您应该使用例如。 Content Security Policy ,以便只允许从特定域加载脚本。重新启动 eval Subresource Integrity

    推荐文章