(萌新向)对于nodejs原型链污染中merge函数的作用的个人理解

set,merge函数 #include <algorithm> #include <set> //集合的几种函数,要求集合a,b从小到大有序,inserter创建一个insert迭代器,因此若是set容器就有去重功能,同理,对vector就用back_inserter创建push_back迭代器,不去重,对于数组只需写c.begin(); //vector容器有 //并集 set_union(a.begin(),a.end(),b.begin(),b.end(),inserter(c,c.begin()) 阅读详情

merge函数

 function merge(target,source){
    for (let key in source){
        if (key in source && key in target){
          merge(target[key], source[key])
        }else {
           target[key]= source[key]
        }   
     }
 }
  
  
 let o1 ={}
 let o2 = JSON.parse('{"a": 1, "__proto__": {"b": 2}}')
 merge(o1,o2)
 console.log(o1.a, o1.b)//1 2
 o3 ={}
 console.log(o3.b)//2

这段函数我看了半天没理解,交给ai一段一段理解,首先关于merge函数的判断

 if (key in source && key in target){
          merge(target[key], source[key])
        }else {
           target[key]= source[key]
        }

ai给出的解释是这样的

 提供的代码片段似乎是一个合并函数的一部分,目的是将 source 对象中的属性合并到 target 对象中。以下是代码的简要解释:
 ​
 条件检查:代码检查给定的 key 是否同时存在于 source 和 target 对象中。
 递归合并:如果 key 在两个对象中都存在,则调用 merge 函数(可能在其他地方定义)递归地合并这两个对象中该键的值。
 赋值操作:如果 key 只在 source 中存在,则将 source 中的该键值直接赋值给 target 对象。

我们举例说明

 假设我们有两个对象 source 和 target,它们的结构如下:
 let source = {  
     a: 1,  
     b: {  
         x: 10,  
         y: 20  
     },  
     c: 3  
 };  
 ​
 let target = {  
     b: {  
         x: 5  
     },  
     d: 4  
 };  
 这个时候我们希望将 source 对象的属性合并到 target 对象中。
 ​
 代码示例
 function merge(target, source) {  
     for (let key in source) {  
         if (key in source && key in target) {  
             merge(target[key], source[key]); // 递归合并  
         } else {  
             target[key] = source[key]; // 直接赋值  
         }  
     }  
 }  
 ​
 merge(target, source);  
 console.log(target);  
 合并步骤解析
 处理 a:
 ​
 a 在 source 中存在,但在 target 中不存在,因此直接赋值。target 变为:
 {  
     b: { x: 5 },  
     d: 4,  
     a: 1  
 }  
 处理 b:
 ​
 b 在 source 和 target 中都存在,进行递归合并。
 进入 merge(target.b, source.b):
 x 在 source.b 和 target.b 中都存在,递归合并。
 y 在 source.b 中存在,但 target.b 中不存在,因此直接赋值。
 结果为:
 {  
     x: 10, // 被 source 中的值替代  
     y: 20  // 新增来自 source 的值  
 }  
 处理 c:
 ​
 c 只在 source 中存在,直接赋值。最终的 target 为:
 {  
     b: { x: 10, y: 20 },  
     d: 4,  
     a: 1,  
     c: 3  
 }  
 最终结果
 合并完成后,target 对象的最终结构如下:
 ​
 {  
     b: { x: 10, y: 20 },  
     d: 4,  
     a: 1,  
     c: 3  
 }  

prototype是一个类的原型属性,可以通过

 __proto__

来访问每个类的原型属性

也就是说,假设我们要向target类中合并source类中的属性,我们需要保留target中有的属性但source中没有的属性不变,并把target和source中都有的属性换成source中属性的值。而proto是每个类中的私有属性,每个类都有,我们如果merge合并target和source中的proto的值,也就是利用proto修改source的原型的值同时赋值给target类。

如果source类中有一个属性是proto,举例如下

 let source={
     a:1,
     "__proto__":{
     b:2
 }
 }
 ​
 let target={
     a:2,
 }

也就是修改了source类的原型类中的b属性为2

我们通过merge函数将source类和target类合并,这里再把merge函数的代码拿过来

 function merge(target,source){
    for (let key in source){
        if (key in source && key in target){
          merge(target[key], source[key])
        }else {
           target[key]= source[key]
        }   
     }
 }

我们进行合并操作

由于source和target类中都有a属性,所以把source中的a属性的值赋值给target中的a属性,target类中a属性值变为1

又由于proto属性是每个类中共有的私有属性,所以把source中proto的值赋值给target类,此时target类变为

 {
     a:1,
     "__proto__":{
         b:2
     }
 }

也就是把target的原型类中的b属性赋值为2,如果target类的的原型类就是object,也就达到了原型链的链头

又因为在原型链中查找属性或方法时,JavaScript 会从当前对象开始,沿着原型链(即 proto 链)向上查找,直到找到相应的属性或方法或直到到达 Object.prototype 的原型(即 null)。如果找不到,则返回 undefined

所以我们只要修改了object类中属性的值,我们就可以在object原型链下面任意类中调用object类中属性的值

举例

 let o1 ={}
 let o2 = JSON.parse('{"a": 1, "__proto__": {"b": 2}}')
 merge(o1,o2)
 console.log(o1.a, o1.b)//1 2
 o3 ={}
 console.log(o3.b)

merge修改了o1类prototype原型类中的属性b为2,由于o1类再往上他的原型类就是object类,所以object类中的b属性为2

所以虽然o3类是空的,我们在o3类中调用b属性,javascript没有在o3类中找到b属性,于是顺着原型链往上找,找到了object类中的b,于是输出值 2

NodeJS原型链污染&ctfshow_nodejs 最近又遇到了有关原型链污染的题目,所以在此总结一下,方便回顾。 阅读详情

相关推荐

【web安全】Nodejs原型链污染分析

Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/course/detail/35475 Nodejs原型链污染分析 什么是js原型? 可以将js原型理解为其他OOP语言中的类,但还是有细微区别。 1. function F(){...} 2. var f = new F(); 分析: 1.创建一个func F,同时创立了一个F对象(该对象默认是接着Object的原

「 虚幻私塾」 992

JavaScript中合并对象的方法merge

方法封装 function merge(target) { for (let i = 1, j = arguments.length; i < j; i++) { let source = arguments[i] || {}; for (let prop in source) { if (source.hasOwnProperty(prop)) { let value = source[prop]; if (value !== un

weixin_44273311的博客 5146

CVE漏洞复现实战:从环境搭建到利用脚本开发全流程解析

在网络安全领域,漏洞复现是理解漏洞原理、提升实战能力的关键环节。其核心在于掌握从环境搭建到漏洞触发的完整流程,这不仅是安全研究的基础,也是渗透测试工程师和CTF选手的必备技能。漏洞复现通常涉及虚拟化平台配置、靶场环境构建、依赖组件部署等步骤,通过模拟真实攻击场景来验证漏洞的存在和影响。在技术层面,常见的漏洞类型如原型链污染(Prototype Pollution)往往源于代码中对对象属性合并的不当处理,攻击者通过污染基础对象原型,可能引发拒绝服务甚至远程代码执行(RCE)等严重后果。从工程实践角度,复现过程

weixin_34320724的博客 411

JS 合并数组的三大方式

如果您想知道一种在JavaScript中合并数组的好方法,那么请记住使用扩展操作符进行合并。在数组字面量中写入两个或更多带有扩展操作符…const all = […heros, …villains] 创建一个合并了heroes和villains数组的新数组。数组字面量中合并数组的顺序很重要:合并数组中的项按照数组在字面量中出现的顺序插入。或者使用另一种方法array.concat()方法不会改变调用它的数组,而是返回一个具有合并结果的新数组。

m0_49515138的博客 1798

TypeScript接口声明合并原理与工程实践指南

接口声明合并是TypeScript类型系统的核心机制之一,本质是同名interface在相同作用域下的成员自动聚合,支撑类型定义的渐进式演进。其原理基于编译期符号合并算法,区别于type别名的静态不可变性,具备开放扩展、重载支持、模块化增强等技术价值。广泛应用于第三方库类型增强(如axios响应结构)、环境变量类型注入(NodeJS.ProcessEnv)、React组件Props分治设计、事件总线强类型注册等典型场景。掌握作用域一致性、成员兼容性、泛型限制等边界条件,可避免合并失效、类型冲突与CI构建异常

weixin_33912246的博客 384

CLI-Anything与OpenCLI:AI时代的新操作系统接口

命令行接口(CLI)正从传统运维工具演进为AI原生时代的操作系统级交互范式。其核心在于将AI能力抽象为可组合、可审计、可脚本化的标准指令流,依托结构化输入/输出契约与确定性元命令机制,实现跨模型、跨语言、跨环境的统一调用。CLI-Anything定义了AI CLI协议层,解决‘如何规范调用’;OpenCLI构建插件化生态层,解决‘如何安全分发与运行’。二者协同,使大模型能力像ls、curl一样即装即用,支撑自动化工作流、CI/CD集成与企业级AI工程落地,成为连接人类意图与AI执行的关键基础设施。

weixin_33906657的博客 326

JS之mergeArray手写实现

JS之mergeArray手写实现

weixin_50238437的博客 605

反者道之动,弱者道之用,SAP HANA 开发里的退、让、藏与生

在 SAP HANA 开发里,我最怕的一类问题,不是 SQL 写错,也不是 Calculation View 激活失败,而是系统看起来每一层都很努力,ABAP 程序在努力循环,HANA 数据库在努力 Join,Calculation View 在努力堆节点,报表前台在努力等待。每个部件都在用力,可整条链路却越来越慢。老子说「反者道之动。弱者道之用。天下万物生於有,有生於无」,放到 SAP HANA 里看,刚好能把这种困境照出来。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1308

nodejs原型链污染

nodejs原型链污染

yink12138的博客 3541

服务器能效测试工具BenchSEE使用方法简介

BenchSEE是由中国标准化研究院开发的一款针对服务器产品能效测试的基准软件。BenchSEE基准的设计参考了全球众多服务器厂家、芯片厂家、能效认证机构和IT节能领域科研机构的意见,旨在满足服务器市场应用对能效测评的需求。BenchSEE基准负载工具支持的服务器类型包括:机架服务器、刀片服务器多节点服务器和机柜服务器等,服务器可以配的最大外理器个数包括:1P,2P和4P等。测试基准涵盖服务器关键部件:CPU,内存和存储介质三大基础部件。

MQWYY3的博客 4222

国税局发票查验中英文验证码识别最新版,识别率99.9%

采用深度学习进行发票查验验证码模型的训练,在我电脑上模型训练的环境如下: 显卡:RTX 2080TI tensorflow-gpu:2.5.3 1 训练集和测试集的准备 发票查验的验证码分为4种类型,分别为黑色、红色、黄色、蓝色,经过我的测试,采用4个模型的效果最好,每个模型对应识别一种类型的验证码。 首先我们4种类型的验证码都准备10万张。 00黑色类型的验证码: 01红色类型的验证码: 02黄色类型的验证码: 03蓝色类型的验证码: 验证码图像图像准备好后,对其进行标记,也就是对验证码重命名:

Keras深度学习 83万+

redpwnctf-web-blueprint-javascript 原型链污染学习总结

前几天看了redpwn的一道web题,node.js的web,涉及知识点是javascript 原型链污染,以前没咋接触过js,并且这个洞貌似也比较新,因此记录一下学习过程 1.本机node.js环境安装 题目都给了源码,所以本地就可以直接安装package.json依赖并本地模拟调试 首先subline安装node环境: http://nodejs.org/ http...

weixin_30345055的博客 305

FPGA中Verilog HDL/VHDL实现NCO(数字控制振荡器)的查表法优化与性能分析

本文深入探讨了在FPGA中使用Verilog HDL/VHDL实现数字控制振荡器(NCO)的查表法优化与性能分析。文章详细解析了NCO的核心工作原理,包括相位累加器、查找表(ROM)的设计,并重点介绍了利用波形对称性压缩ROM、相位抖动注入等关键优化技巧,以提升无杂散动态范围(SFDR)并平衡速度、精度与资源消耗。

vscode6remote的博客 457

node漏洞 【持续更新】

node漏洞 持续更新

weixin_51458899的博客 1985

QCustomPlot实现毫秒级时间轴数据的动态可视化与实时刷新优化

本文深入探讨了如何利用QCustomPlot库高效实现毫秒级时间轴数据的动态可视化与实时刷新。文章从基础配置讲起,详细介绍了时间轴初始化、数据平滑滚动、增量更新与内存管理等核心优化技巧,并分享了应对高频数据的缓冲策略及OpenGL硬件加速等高级优化手段,旨在解决实时图表卡顿问题,提升流畅度。

weixin_29012677的博客 425

图相似度模型(论文篇)

图相似度模型

weixin_43702653的博客 5750

Lodash 严重安全漏洞背后 你不得不知道的 JavaScript 知识

摘要: 详解原型污染。 原文:Lodash 严重安全漏洞背后 你不得不知道的 JavaScript 知识 作者:Lucas HC Fundebug经授权转载,版权归原作者所有。 可能有信息敏感的同学已经了解到:Lodash 库爆出严重安全漏洞,波及 400万+ 项目。这个漏洞使得 loda...

chongmei5647的博客 139

半导体工艺仿真:离子注入工艺仿真_(8).损伤和缺陷仿真

离子注入工艺在半导体制造中是一个重要的步骤,用于在半导体材料中引入特定的掺杂剂。然而,离子注入过程中不可避免地会产生损伤和缺陷,这些损伤和缺陷会直接影响器件的性能和可靠性。因此,对离子注入工艺中的损伤和缺陷进行仿真研究是必不可少的。本节将详细介绍如何使用仿真软件对离子注入过程中的损伤和缺陷进行建模和分析。

2401_87715305的博客 1340

javascript extend_Lodash 严重安全漏洞背后 你不得不知道的 JavaScript 知识

可能有信息敏感的同学已经了解到:Lodash 库爆出严重安全漏洞,波及 400万+ 项目。这个漏洞使得 lodash “连夜”发版以解决潜在问题,并强烈建议开发者升级版本。我们在忙着“看热闹”或者“”升级版本”的同时,静下心来想:真的有理解这个漏洞产生的原因,明白漏洞修复背后的原理了吗?这篇短文将从原理层面分析这一事件,相信“小白”读者会有所收获。漏洞原因其实漏洞很简单,举一个例子:lodash ...

weixin_39912303的博客 209

大厂面试:字节跳动大数据面试题及参考答案(10万字长文及多张原理图持续更新)

在 Spark 中,宽窄依赖是用来描述 RDD(弹性分布式数据集)之间的依赖关系的概念。窄依赖是指父 RDD 的每个分区最多被一个子 RDD 的分区使用,即子 RDD 的分区可以通过确定的规则从父 RDD 的分区计算得到,并且不需要跨节点进行数据传输。窄依赖通常可以在一个节点上进行计算,不需要进行数据的 shuffle 操作,因此性能较高。宽依赖是指父 RDD 的一个分区可能被多个子 RDD 的分区使用,即子 RDD 的分区需要通过跨节点的数据 shuffle 操作从父 RDD 的多个分区获取数据。

大模型大数据攻城狮的专栏 1651

2024年数字IC秋招-大疆-数字芯片开发工程师-笔试题

笔试题型:选择题 + 简答题笔试平台:大疆创新(电脑监控)笔试时间:90min做题感受:知识面覆盖很广,很多题目不会做(1) 什么是功耗优化中的DVFS技术?(2)降低功耗的原理是什么?(3)一般工作流程是怎样的?(4)必须的硬件模块有哪些?

qq_42135020的博客 2667

[CTFSHOW] nodejs

web 334 下载源码.zip #user.js module.exports = { items: [ {username: 'CTFSHOW', password: '123456'} ] }; var express = require('express'); var router = express.Router(); var users = require('../modules/user').items; var findUser = function(name, pas

Dannie01的博客 590

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Lodash 严重安全漏洞背后:你不得不知道的 JavaScript 知识

作者 | Lucas HC来源 | https://zhuanlan.zhihu.com/p/73186974可能有信息敏感的同学已经了解到:Lodash 库爆出严重安全...

web前端开发 363

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: [nodejs原型链污染及绕过]校赛第四次纳新赛 bypass WP
下一篇: [SWPUCTF 2021 新生赛]finalrce
Acc1oFl4g
博客等级 码龄7年 112粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值