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

时间:2018-08-23 07:04:02

标签: javascript xss

如果攻击者在页面上成功运行了一些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);

一旦调用了restoreJWTToken():

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

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

lib.jwtToken

有什么方法可以设计此变量,以便MyLib只能读取此变量,以避免使用XSS?

1 个答案:

答案 0 :(得分:1)

  

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

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

您可以使用以下方法创建仅类/对象可访问的变量: Range.Copy

(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发送或获取数据有关的所有功能。并已在该阶段获取关键数据。

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

首先应重点注意防止脚本注入,例如使用WeakMap,以便仅允许从某些域加载脚本。要恢复eval权限,请防止内联脚本确保Content Security Policy