【JS】闭包的漏洞

下面这段代码可以实现:通过立即执行函数o返回对象中的get方法,通过参数key得到fn函数内部对象obj中的值。

var fn = function () {
  var obj = {
    a: 1,
    b: 2
  }
  return {
    get: function (key) {
      return obj[key]
    }
  }
}()
console.log(fn.get('b')); // 2

这是一个典型的闭包场景,这种做法可以做到屏蔽fn内部的obj,不可在外部直接访问obj,只能通过返回的get方法读取数据

这是很多第三方库的做法,但是通过漏洞,也可以做到直接修改fn函数内部obj的值。

上述写法中,get方法的权限过大,除了obj自身的属性a和b之外,还可以访问到它的原型成员

方式一:valueOf

初步想法可以通过原型上的 valueOf 方法,获取obj本身。

尝试获取valueOf方法:

console.log(fn.get('valueOf'));

在这里插入图片描述

可以正常访问到valueOf方法,但是执行后发现报错:

console.log(fn.get('valueOf')());

在这里插入图片描述

这是由于valueOf语法为:obj.valueOf(),上述代码执行后等于直接调用valueOf(),所以该方法不适合上述场景。

但是如果get方法返回的不是一个值,而是函数调用的话,那么该方法就可以正常执行了。具体如下:

var fn = function () {
  var obj = {
    a: ()=>{return 1},
    b: ()=>{return 2}
  }
  return {
    get: function (key) {
      return obj[key]()
    }
  }
}()

let o = fn.get('valueOf')
console.log(o)  // 正常获取
console.log(fn.get('a'))  // 1

篡改obj数据

o.a = () => {return "abcdefg"}
o.b = () => {return "1234567"}
console.log(fn.get('a')) // 'abcdefg' 
console.log(fn.get('b'))// '1234567'

方式二:Object.defineProperty

当一个属性为访问器时,读取这个属性,就会变成函数调用

在原型上随意添加一个属性

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

此时通过fn中的get函数读取原型上的属性qwe时,就会触发get函数,return的this就是fn中的obj。

在这里插入图片描述
后续可以对这个对象进行篡改

let o = fn.get('qwe')
o.a = "123"
o.b = "456"
console.log(fn.get('a')) // '123'
console.log(fn.get('b')) // '456'

如何处理这个漏洞

如果封装一些公共模块儿时,一定要注意处理这个漏洞,避免数据被污染或恶意篡改。

解决方法

一、检查参数

get的参数key,要添加检查必须为obj本身的属性,不能是原型上的。

此时需要使用一个Object的静态方法:Object.hasOwnProperty

var fn = function () {
  var obj = {
    a: 1,
    b: 2
  }
  return {
    get: function (key) {
      if(obj.hasOwnProperty(key)){
      	return obj[key]
      }
      return undefined
    }
  }
}()

再次尝试获取在原型上添加的qwe属性,发现无法获取。

fn.get('qwe')

在这里插入图片描述

二、将fn内的obj原型设为空

使用Object.setPrototypeOf(),将obj的原型设置为空。

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

尝试获取obj,由于原型为null,所以返回undefined。

fn.get('qwe')

在这里插入图片描述
更多Object的静态方法可以看另一篇文章:Object的静态方法

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小红书扫码登录分析与python实现

文章目录 1. 写在前面2. 接口分析3. 代码实现 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python…

基于ssm电子竞技管理平台的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本电子竞技管理平台就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息…

MySQL、Oracle的时间类型字段自动更新:insert插入、update更新时,自动更新时间戳。设置自增主键id,oracle创建自增id序列和触发器

1. MySQL 支持设置自增id的字段类型:int、bigint、double等数值类型,一般用int、bigint支持设置自动更新时间的字段类型:datetime、timestamp下面sql中的now()函数可以用current_timestamp()替代 1.1. 不指定秒精度 drop table if exists …

135. 分发糖果(力扣LeetCode)

文章目录 135. 分发糖果题目描述贪心算法代码如下 总结 135. 分发糖果 题目描述 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求,给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩…

Leetcode - 周赛389

目录 一,3083. 字符串及其反转中是否存在同一子字符串 二,3084. 统计以给定字符开头和结尾的子字符串总数 三,3085. 成为 K 特殊字符串需要删除的最少字符数 四,3086. 拾起 K 个 1 需要的最少行动次数 一,3083. 字符…

Java的三大特性之一——继承

前言 http://t.csdnimg.cn/uibg3 在上一篇中我们已经讲解过封装,这里就主要讲解继承与多态 继承 1.为什么需要继承 Java中使用类对现实世界中实体来进行描述,类经过实例化之后的产物对象,则可以用来表示现实中的实体,但是现实…

centos7安装jdk详细步骤(yum安装与手动安装)

centos7安装jdk详细步骤(yum安装与手动安装) 一、使用yum安装1. 准备工作2. 检查系统是否自带jdk3. 安装jdk 二、手动安装jdk1. 下载上传jdk2. 安装jdk3. 配置环境变量 一、使用yum安装 1. 准备工作 如果你的机器可以联网可以使用此方法 ping www.baidu…

2、Java虚拟机之类的生命周期-连接(验证、准备、解析)

一、类的生命周期 连接阶段之验证 连接阶段的第一个环节是验证&#xff0c;验证的主要目的是检测Java字节码文件是否遵守了<Java虚拟机规范>中的约束。这个阶段一般是不需要程序员进行处理。 主要包含如下四个部分,具体详见<<Java虚拟机规范>>: 1、文件格…

mysql+keepalived实现对mysql的高可用

mysql数据库出现问题 133 解决方案: 在133mysql终端 实行如下命令 mysqlkeepalived实现对mysql的高可用 132 keepalived配置如下 133 keepalived配置如下 132重启keepalived服务 132关闭mysqld服务&#xff0c;vip不见了 133收到vip 132重启mysqld服务和keepalived服务,vip…

C语言——程序拷贝文件

问题如下&#xff1a; 写一个程序拷贝文件&#xff1a; 使用所学文件操作&#xff0c;在当前目录下放一个文件data.txt&#xff0c;写一个程序&#xff0c;将data.txt文件拷贝一份&#xff0c;生成data_copy.txt文件。 基本思路&#xff1a; 打开文件data.txt&#xff0c;读…

PTA题解 --- 剪切粘贴(C语言)

今天是PTA题库解法讲解的第五天&#xff0c;今天我们要讲解剪切粘贴&#xff0c;题目如下&#xff1a; 解题思路&#xff1a; 为了解决这个问题&#xff0c;你可以按照以下步骤进行&#xff1a; 读取输入字符串&#xff1a;首先读取原始字符串。 进行操作&#xff1a;根据输入…

【网络】数据中心网络技术概览

数据中心网络技术概览 一、数据中心网络架构 Crossbar架构&#xff1a;源自早期电话交换网络&#xff0c;由多个输入/输出端口和开关矩阵组成&#xff0c;实现设备间的任意连接&#xff0c;灵活且高效。 **Crossbar架构&#xff08;Crossbar Architecture&#xff09;是一种计…

springboot+vue考试管理系统

基于springboot和vue的考试管理系统 001 springboot vue前后端分离项目 本文设计了一个基于Springbootvue的前后端分离的在线考试管理系统&#xff0c;采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

000_coolprop_in_matlab在Matlab中使用CoolProp

在Matlab中使用CoolProp 简介 CoolProp是一个开源的热力学性质库&#xff0c;可以计算多种流体的热力学性质。CoolProp支持多种编程语言&#xff0c;包括Python、C、Matlab等。本文将介绍如何在Matlab中使用CoolProp。 CoolProp官网 本文所使用的Matlab版本为R2021a。 在Ma…

大数据分析-基于Python的网络爬虫及数据处理---智联招聘人才招聘特征分析与挖掘的算法实现

概要 随着科学技术的发展&#xff0c;人类进入了互联网时代&#xff0c;不仅数据量庞大&#xff0c;而且数据种类繁多&#xff0c;Python简单易学, 语法清晰&#xff0c;在数据操作方面有着一定优势&#xff0c;成为了数据采集和可视化领域的热门语言。本论文主要是使用Python来…

SG5032VAN差分晶振X1G004261001100专用于5G通讯设备

差分晶体振荡器(DXO)是目前行业中公认高技术&#xff0c;高要求的一款晶体振荡器&#xff0c;是指输出差分信号使用2种相位彼此完全相反的信号,从而消除了共模噪声,并产生一个更高性能的系统。差分晶振一般为六脚贴片晶振&#xff0c;输出类型分为好几种,LVDS&#xff0c;LV-PE…

MySQL | 视图

视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表&#xff0c;基表的数据变化也会影响到视图。 1. 基本使用 1.1. 创建视图 create view 视图名 as select语句&#xff1b; 创建测…

(2023,图像放大与超分辨率,扩散,缩放堆叠表示,多分辨率混合,多尺度联合抽样)Ten 的生成能力

Generative Powers of Ten 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 2. 相关工作 4. 方法 4.1. 缩放堆叠表示 4.2. 多分辨率混合 4.3. 多尺度一致抽样 4.4. 基于照片…

全球大型语言模型(LLMS)现状与比较

我用上个博文的工具将一篇ppt转换成了图片&#xff0c;现分享给各位看官。 第一部分&#xff1a;国外大语言模型介绍 1&#xff0c;openai的Chatgpt 免费使用方法1&#xff1a;choose-carhttps://share.freegpts.org/list 免费使用方法2&#xff1a;Shared Chathttps://share…

查看文件内容的指令:cat,tac,nl,more,less,head,tail.file

目录 cat 介绍 输入重定向 选项 -b -n -s tac 介绍 输入重定向 nl 介绍 示例 more 介绍 选项 less 介绍 搜索文本 选项 head 介绍 示例 选项 -n tail 介绍 示例 选项 file cat 介绍 将标准输入(键盘输入)的内容打印到标准输出: 输入重定向 本应…