第一练

78 阅读1分钟

闭包提权漏洞题

var o = function(){

  var obj = {
    a: 1,
    b: 2,
  }

  return {
    get: function(k) {
      return obj[k]
    }
  }
}()

实现

问题
    1. 不修改原本的方法,获取obj这个对象
    2. 不能通过 o.get() 获取原型上的属性
    3. 基于2的条件,但是内部可以使用原型上的属性
需要掌握哪些知识
    this, 原型链, Object

问题1:

补充:

了解以上题,先了解一下this指向

关于this,谁调用就指向谁,没有调用者,就指向全局对象window。
eg.

const obj = {
    a: 1,
    fn: function() {console.log(this, this.a)}
}

var a = 2

var getA = obj.fn
getA() // 2

obj.fn() // 1

Object.prototype.valueOf:  返回当前的对象

eg.

const obj = {a: 1}
obj.valueOf() // {a: 1}

解题
o.get('valueOf')()
// 当执行,会出现 TypeError: Cannot convert undefined or null to object

o.get('valueOf')() 解析 ==>

var fn = o.get('valueOf')  
fn()

// 这下看着像上面的this 案例了哇, 所以通过valueOf 无法获取当前的对象

// 思路: 可以通过在原型上面添加获取属性的方法
// 使用defineProperty来进行数据劫持, 新增一个getObj

Object.defineProperty(Object.prototype, 'getObj', {
  get() {
    return this
  }
})


o.get('getObj')

// 成功获取obj 对象


问题2:

思路: 对象不继承原型上的属性

var o = function(){

  // 1.取消原型
  // var obj = Object.create(null)
  // obj.a = 1
  // obj.b = 2

  // 2.
  var obj = {
    a: 1,
    b: 2,
  }

  Object.setPrototypeOf(obj, null)

  return {
    get: function(k) {
      return obj[k]
    }
  }
}()


问题3:


 in 和 hasOwnProperty
 in: 能回到原型的数据
 hasOwnProperty: 只能获取自身的数据
 
 // 了解了in和hasOwnProperty  自需要在get 里面做一个判断
 var o = function(){

  var obj = {
    a: 1,
    b: 2,
  }

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

      return undefined
      
    }
  }
}()