加入收藏 | 设为首页 | 会员中心 | 我要投稿 银川站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

JS怎样解决闭包漏洞问题 办法有哪些

发布时间:2023-06-15 13:48:21 所属栏目:语言 来源:
导读:在这篇文章中我们来了解一下“JS怎样解决闭包漏洞问题,方法有哪些”,一些朋友可能会遇到这方面的问题,对此在下文小编向大家来讲解,内容详细,易于理解,希望大家阅读完这篇能有收获哦,有需要的朋友就

在这篇文章中我们来了解一下“JS怎样解决闭包漏洞问题,方法有哪些”,一些朋友可能会遇到这方面的问题,对此在下文小编向大家来讲解,内容详细,易于理解,希望大家阅读完这篇能有收获哦,有需要的朋友就往下看吧!

在不修改下面代码的情况下,修改obj的内容

var o = (()=>{

var obj = {

a:1,

b:2,

};

return {

get :(n)=>{

return obj[n]

}

}

})()

上面代码就是一个典型的闭包模式。屏蔽掉obj本身。只能访问闭包返回的数据而不能去修改数据源本身,但是他的数据源是一个对象,这就会出现一个漏洞!!!!,而上面的代码就会出现一个致命的漏洞。

问题原理:

console.log(o.get("a"));//1

console.log(o.get("b"));//2

貌似我们在没有可选值传入了?但是你要记住,在js中万物皆是对象,对象通过原型来继承原型对象上的属性和方法。

Object.protoType()原型对象。

方法一:

那我能不能去访问到原型valueOf,暂时说想通过valueOf()来获取这个对象本身。

JavaScript 中的 valueOf() 方法用于返回指定对象的原始值,若对象没有原始值,则将返回对象本身。

console.log(o.get("valueOf"));

//[Function: valueOf]

let obj2 = o.get("valueOf")()

//TypeError: Cannot convert undefined or null to object

可以看的出来,报错,这是因为valueOf函数的this指向发生了错误

方法二:

虽然提供了一个函数进入传参,但是传入的权限很大,就会有很大的问题。

有没有一种方法,直接访问对象的属性的时候通过一个函数来获取,这时候就是构造器属性。

给对象的原型设置一个访问器属性

Object.defineProperty(Object.prototype,"abc",{

get(){

return this

}

})

console.log(o.get("abc"));//{ a: 1, b: 2 }

在这里就会通过访问这个原型链上的访问器属性来返回一个访问它这个的对象,这样我就拿到了这个对象。

let obj = o.get("abc")

obj.a='hjkasd'

obj.b='12345'

obj.c='勇敢牛牛,不怕困难'

console.log(obj);//{ a: 'hjkasd', b: '12345', c: '勇敢牛牛,不怕困难' }

这就导致一个很严重的问题。我能修改 闭包的值。如果是第三方库。那很轻易的破坏了库的结构。

解决办法;

我刚才通过访问原型链上的属性,达到返回这个寻求的对象。从而破会掉结构。

那么就需要判断访问的属性是否来自对象本身。从而返回不同的值。

var o = (()=>{

var obj = {

a:1,

b:2,

};

return {

get :(n)=>{

if(!obj.hasOwnProperty(n)){

return `${n}在此对象本身不存在`

}

return obj[n]

}

}

})()

解决方法二:

直接设置这个对象的原型为null,没有原型链,那我上面的逻辑就行不通,自然就保护了数据的隐私性。

var o = (()=>{

let obj = {

a:1,

b:2,

};

Object.setPrototypeOf(obj,null)

return {

get :(n)=>{

return obj[n]

}

}

})()

以上就是关于“JS怎样解决闭包漏洞问题,方法有哪些”的介绍了,感谢各位的阅读。

(编辑:银川站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!