javaScript闭包漏洞

文章讨论了如何在不修改对象内部内容的情况下,安全地处理对象属性。通过示例展示了使用`Object.defineProperty`可能引发的问题,即利用返回的`this`修改原对象。提出了两种解决方案:1)在get函数中增加判断,仅返回对象自身的属性;2)设置对象的原型为null,避免原型链上的意外修改。
摘要由CSDN通过智能技术生成

源代码:要求:不修改obj内内容,改变obj

  var object1 = (function () {
      var obj = {
        a: 1,
        b: 2,
      };
      return {
        get: function (k) {
          return obj[k];
        },
      };
    })();

答案:

   Object.defineProperty(Object.prototype, "abc", {
      get() {
        return this;
      },
    });
    var obj2 = object1.get("abc");
    obj2.c = 2;

使用Object.defineProperty为object1 的Object.prototype添加另一个属性,利用返回值是this的bug修改obj

防止这种情况

1.在get函数中添加判断,判断k是不是obj的属性,不是的话返回undefinef

 return {
        get: function (k) {
          if (obj.hasOwnProperty(k)) {
            return obj[k];
          }
          return undefined;
        },
      };

2.如果用不到obj原型上的任何东西的话,就用 

Object.setPrototypeOf(obj, null);

设置原型为空此时代码变为

 var object1 = (function () {
      var obj = {
        a: 1,
        b: 2,
      };
      Object.setPrototypeOf(obj, null);
      return {
        get: function (k) {
          return obj[k];
        },
      };
    })();

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值