【JS】闭包的漏洞

news2024/11/15 18:48:40

下面这段代码可以实现:通过立即执行函数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的静态方法

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3个好用的WP免费主题

免费wordpress模板下载 高端大气上档次的免费wordpress主题,首页大图全屏显示经典风格的wordpress主题。 https://www.wpniu.com/themes/289.html 经典的红色免费wordpress主题 这是一款经典的免费wordpress主题,被广泛应用于多个行业的网站。 https…

智慧公厕的系统构成与功能解析

智慧公厕系统是通过传感器和云平台相结合的创新技术,旨在提供更好的公厕管理与服务。智慧公厕从系统的构成来看,主要分为感知层(数据收集)、传输层(数据传输)、平台层(数据处理)和应…

VUE+Vant实现H5组织架构选人选公司组件

提醒自己: 这是之前的逻辑,或许你重新写会有更好的方法,可以参考逻辑!!! 功能介绍 1.有面包屑点击切换 2.有公司、部门、人员 3.单选、多选实现 4.编辑/回显 5.使用随意切换层级和跳转到指定层级回显等功…

CSAPP | Lab1-Data Lab 详细解析

You may assume that your machine:1. Uses 2s complement, 32-bit representations of integers.2. Performs right shifts arithmetically.3. Has unpredictable behavior when shifting if the shift amountis less than 0 or greater than 31.Part1:整数 1.Bit…

力扣爆刷第102天之hot100五连刷96-100

力扣爆刷第102天之hot100五连刷96-100 文章目录 力扣爆刷第102天之hot100五连刷96-100一、136. 只出现一次的数字二、169. 多数元素三、75. 颜色分类四、31. 下一个排列五、287. 寻找重复数 一、136. 只出现一次的数字 题目链接:https://leetcode.cn/problems/sing…

Java疫苗接种管理系统

本系统lw为2024-3-21本人原创,查chong13% 1.3W字,可以直接上交,这并不是乱七八糟的技术文档和项目文档。 4.2 功能结构设计 可视化的疫苗接种管理系统功能结构设计主要包括以下几个模块: 登录注册模块:这个模块负责…

算法体系-14 第十四 贪心算法(上)

一 、 递归套路解决判断完全二叉树 1.1 描述 1.2 分析 1.2 分析 第二种 第三种 第四种 1.3 代码 public static boolean isCBT2(Node head) {return process(head).isCBT;}public static class Info {public boolean isFull;public boolean isCBT;public int height;public…

hcia静态实验

题目: 要求: 1、R6为isp,接口ip均为公有地址,该设备只能配置ip地址,之后不能再对其进行任何其他配置 2、r1到r5为局域网,私有ip地址为192.168.1.0 24,合理分配 3、r1,r2,r4各有两个环回地址&am…

2024年全国职业院校技能大赛中职组大数据应用与服务赛项题库参考答案陆续更新中,敬请期待…

2024年全国职业院校技能大赛中职组大数据应用与服务赛项题库参考答案陆续更新中,敬请期待… 武汉唯众智创科技有限公司 2024 年 3 月 联系人:辜渝傧13037102709 题号:试题04 ZZ052-大数据应用与服务赛选赛题04 模块一:平台搭建…

JVM面试篇

面试篇就是复习前面学的 什么是JVM 1.定义:JVM指的是Java虚拟机,本质是一个运行在计算机上的程序 2.作用:为了支持Java中Write Once ,Run Anywhere 编写一次 到处运行的跨平台特性 功能: 1.解释和运行 2.内存管理…

jconsole的使用

前提 已安装jdk 使用步骤 1、命令行输入jconsole

#Linux(第一个Hello World以及GCC基本用法)

(一)发行版:Ubuntu16.04.7 (二)记录: (1)gcc简介:GCC(GNU Compiler Collection,GNU编译器套件)是由GNU开发的编程语言编译器。GNU编译…

收割互联网大厂Offer面经

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

HarmonyOS系统开发ArkTS常用组件文本输入及参数

TextInput文本输入组件,用于接收用户输入的文本内容。 1、TextInput组件的参数 TextInput(value?:{placeholder?: string|Resource , text?: string|Resource}) placeholder属性用于设置无输入时的提示文本text用于设置输入框当前的文本内容 Entry Component st…

Javaweb学习记录(三)请求响应案例

下面为一个请求响应案例,postman发送请求,服务器响应将一个xml文件中的数据通过读取解析,将其用Result类标准的格式返回前端,在前端用json的方式显示 后端Controller代码 1、通过本类的字节码文件得到类加载器并寻找到需要解析的…

最全APP抓包大法

前言:最近工作中遇到一些比较奇葩的App,一边测试一边搜集整理出了比较全的姿势。如有错误之处,还请各位师傅多多指教。 如何判断:连接Fiddler代理–>抓不到包–>关闭Fiddler后正常通信。 解决方法:PC端模拟器如…

鸿蒙Harmony应用开发—ArkTS-全局UI方法(自定义组件的生命周期)

自定义组件的生命周期回调函数用于通知用户该自定义组件的生命周期,这些回调函数是私有的,在运行时由开发框架在特定的时间进行调用,不能从应用程序中手动调用这些回调函数。 说明: 本模块首批接口从API version 7开始支持&#x…

Springboot笔记(web开启)-08

有一些日志什么的后续我会补充 1.使用springboot: 创建SpringBoot应用,选中我们需要的模块;SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来自己编写业务代码; 2.SpringBoot对静态资源的映…

python基本概念和基本数据类型

一、基本概念 1.变量 变量是编程语言中最基本的概念,和字面意思一样,指的就是他们的值可变,和我们以前学习的方程类似,变量可以代入任何值。 命名规范:变量一般使用: 英文字母、下划线 和 数字组成 2.关键…

Codeforces Round 935 (Div. 3)A~E

A. Setting up Camp 题目分析: 有三种人,内向、外向、综合,内向必须独自一个帐篷,外向必须3个人一个帐篷,综合介于1~3人一个帐篷,我们发现非法情况只会存在外向的人凑不成3个人一个帐篷的情况,因外向不够可…