闭包提权漏洞题
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
}
}
}()