闭包漏洞


💡

突破点:原型

不直接修改 o, 修改 obj 对象,这是一个 IFEE 的闭包函数,一般使用闭包都是为了不暴露内部的变量。但是要注意一些特殊的漏洞处理.

const o = (function () {
  const obj ={
    a: 1,
    b: 2,
  };
  // 漏洞修复 01: //   Object.setPrototypeOf(obj, null);
  return {
    get: function (a) {
      // 漏洞修复 02: if (!obj.hasOwnProperty(a)) return undefined;
      return obj[a];
    },
  };
})();

Object.defineProperty(Object.prototype, 'abc', {
  // getter
  get() {
    return this;
  },
});

// get this
const a = o.get('abc');
// 侵入:修改 b
a.b = 22;
console.log(o.get('b'));