JavaScript闭包漏洞与修补措施

请先看下面一段代码

	var obj = (function () {var sonObj = {a: 1,b: 2}return {get: function (v) {return sonObj[v]}}})()

可以看出,这是一段很典型的js闭包代码,可以通过obj调用get方法传一个参数,如果传的是a就可以得到闭包内的对象sonObj.a

	var obj = (function () {var sonObj = {a: 1,b: 2}return {get: function (v) {return sonObj[v]}}})()console.log(obj.get('a'))

如下,正确的获取到了sonObj的属性a
在这里插入图片描述
这是一个典型的闭包场景,这样做的目的是为了屏蔽这个obj,不让外边直接访问它,只能读取它的某一个属性,这样就保护了数据的完整性
但这样做有一个问题
,那就是没有处理js闭包的漏洞,给的权限太大了
用户可以通过,obj.get访问到sonObj的任何成员,包括prototype上的成员
所以我们就可以利用可以访问prototype来达到我们想要做的事
我们都知道对象上的value上的valueOf这个方法会返回对象自身
也就是说,我们能通过

obj.valueOf()

来获取到这个对象,方向有了,但是这样还不够.如下

var obj = (function () {var sonObj = {a: 1,b: 2}return {get: function (v) {return sonObj[v]}}
})()
console.log(obj.get('valueOf')())

在这里插入图片描述

如上图,报错了
Uncaught TypeError: Cannot convert undefined or null to object
无法将未定义或 null 转换为对象
为什么会出现这种问题呢?
这是因为this指向的问题
因为我们只有通过sonObj调用valueOf的时候,才能返回sonObj对象
而obj.get(‘valueOf’)()明显不是,是通过get方法获取到了valueOf这个方法本身,然后通过这个方法本身去调用的,那么这时候this的指向就变成了全局
所以这种方法是行不通了,那需要怎么办呢?
很简单,我们只需要让sonObj的某一个成员,在被读取的时候,返回它自身就好了,
如下,我们让object的原型上添加一个方法,让这个方法被访问的时候,返回它

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

这样,当访问aaa这个属性的时候,sonObj没有这个成员,就会去prototype上找,然后就会调用prototype上的aaa方法,然后就把自己返回出去了,闭包也就破解了

	var obj = (function () {var sonObj = {a: 1,b: 2}return {get: function (v) {return sonObj[v]}}})()Object.defineProperty(Object.prototype,'aaa',{get(){return this}})console.log(obj.get('aaa'))

在这里插入图片描述
诺,sonObj就到手了

那话又说回来了,该怎么防御呢?
简单,它不是原型上整活吗?,我们让sonObj原型指向null,欸,我没有原型了,也就不存在这种错误了
头痛?把脑袋砍了,就再也不会头痛了,简直是太妙了~

	var obj = (function () {var sonObj = {a: 1,b: 2}Object.setPrototypeOf(sonObj,null)return {get: function (v) {return sonObj[v]}}})()Object.defineProperty(Object.prototype,'aaa',{get(){return this}})console.log(obj.get('aaa'))

在这里插入图片描述
但是在实际开发中一般不这么做,因为原型树上可能有别的方法能用得上,所以我们可以在sonObj的方法内加个判断,如果是对象上的成员就让他正常返回,如果不是就返回undefinded,

	var obj = (function () {var sonObj = {a: 1,b: 2}return {get: function (v) {if(obj.hasOwnProperty(v))return sonObj[v]return undefined}}})()Object.defineProperty(Object.prototype,'aaa',{get(){return this}})console.log(obj.get('aaa'))

在这里插入图片描述
不过这样写其实又出现了新的问题,关于直接手写undefined的问题,但是这里就不展开说了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/506005.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue+element模仿实现云码自动验证码识别平台官网

一、项目介绍 项目使用传统vue项目结构实现,前端采用element实现。 element官网:Element - The worlds most popular Vue UI framework 云码官网地址:云码-自动验证码识别平台_验证码识别API接口_免费验证码软件 项目截图,支持…

【开源】JAVA+Vue.js实现个人健康管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 健康档案模块2.2 体检档案模块2.3 健康咨询模块 三、系统展示四、核心代码4.1 查询健康档案4.2 新增健康档案4.3 查询体检档案4.4 新增体检档案4.5 新增健康咨询 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpri…

CKKS EXPLAINED, PART 5: RESCALING

CKKS EXPLAINED, PART 5: RESCALING Introduction 在之前的 CKKS 解释系列文章的第四部分《乘法和重线性化》中,我们了解了 CKKS 中的密文乘法是如何工作的,为什么我们需要对输出进行重线性化以保持密文大小不变,以及如何执行重线性化操作。…

LDR6328芯片:智能家居时代的小家电充电革新者

在当今的智能家居时代,小家电的供电方式正变得越来越智能化和高效化。 利用PD(Power Delivery)芯片进行诱骗取电,为后端小家电提供稳定电压的技术,正逐渐成为行业的新宠。在这一领域,LDR6328芯片以其出色的…

【深度优先搜索】【树】【C++算法】2003. 每棵子树内缺失的最小基因值

作者推荐 动态规划的时间复杂度优化 本文涉及知识点 深度优先搜索 LeetCode2003. 每棵子树内缺失的最小基因值 有一棵根节点为 0 的 家族树 ,总共包含 n 个节点,节点编号为 0 到 n - 1 。给你一个下标从 0 开始的整数数组 parents ,其中…

批次大小对ES写入性能影响初探

问题背景 ES使用bulk写入时每批次的大小对性能有什么影响?设置每批次多大为好? 一般来说,在Elasticsearch中,使用bulk API进行批量写入时,每批次的大小对性能有着显著的影响。具体来说,当批量请求的大小增…

langchain学习笔记(九)

RunnableBranch: Dynamically route logic based on input | 🦜️🔗 Langchain 基于输入的动态路由逻辑,通过上一步的输出选择下一步操作,允许创建非确定性链。路由保证路由间的结构和连贯。 有以下两种方法执行路由 1、通过Ru…

基于tomcat的JavaWeb实现

Tomcat服务器 免费,性能一般的服务器 安装配置 基于Java,故需要配置环境变量,新加系统路径JAVA_HOME,路径为jdk的主目录。 而后打开bin目录下的startup.bat文件出现如下窗口说明配置成功 idea继承tomcat服务器 使用java开发…

在 Ubuntu 终端输出不同颜色、粗体、下划线或其他样式的字体

嗯。调试时总发现自己打印的调试信息太过普通、单调,于是乎…… Notice 要在终端实现字体的特殊样式,通常通过使用特殊的控制字符来实现,而不是通过某语言本身的功能来实现。 在大多数终端中,可以使用 ANSI 转义序列来设置字体的…

Bulingbuling - 《历史的教训》 [ The Lessons of History ]

《历史的教训》 两位当代最伟大思想家的著名论文集,汇集了 5000 多年的历史 作者:威尔-杜兰特和阿里尔-杜兰特 The Lessons of History The celebrated collection of essays compiling over 5,000 years of history by two of the greatest thinkers …

一次电脑感染Synaptics Pointing Device Driver病毒的经历,分享下经验

没想到作为使用电脑多年的老司机也会电脑中病毒,周末玩电脑的时候突然电脑很卡,然后自动重启,奇怪,之前没出现这个情况。 重启后电脑开机等了几十秒,打开任务管理器查看开机进程,果然发现有个Synaptics Po…

《梦幻西游》本人收集的34个单机版游戏,有详细的视频架设教程,值得收藏

梦幻西游这款游戏,很多人玩,喜欢研究的赶快下载吧。精心收集的34个版本。不容易啊。里面有详细的视频架设教程,可以外网呢。 《梦幻西游》本人收集的34个单机版游戏,有详细的视频架设教程,值得收藏 下载地址&#xff1…