尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
JavaScript原型污染漏洞Prototype Pollution
文章目录原型链污染漏洞 Prototype PollutionJavaScript语言的对象继承机制。防御方法扩展阅读原型链污染漏洞 Prototype Pollution原型污染Prototype Pollution是一种针对 JavaScript 运行时的注入攻击手法。攻击者利用该漏洞能够篡改对象属性的默认值从而干扰应用程序的正常业务逻辑最终可能引发拒绝服务攻击DoS或远程代码执行RCE等严重安全风险。下面是一个原型污染漏洞的示例functionmerge(target,source){for(letkeyinsource){console.log(source,key)if(keyinsourcekeyintarget){console.log(key,key)merge(target[key],source[key])}else{console.log(key,key)target[key]source[key]}}}leto1{}leto2JSON.parse({a: 1, __proto__: {b: 2}})console.log(o2)merge(o1,o2)console.log(o1.a,o1.b)//1 2o3{}console.log(o3.b)//2在该示例中merge函数存在原型污染漏洞。攻击者通过构造o2对象将__proto__作为一个属性键key传入merge函数导致o1的__proto__字段被改写从而为其原型链添加了属性b: 2。由于__proto__指向Object.prototype所有继承该原型的对象如后续创建的o3都会自动拥有这个被注入的属性b。这个过程就是原型链被污染的过程。原型污染漏洞的根源在于 JavaScript 语言独特的对象继承机制以及其对象属性的公开性。JavaScript语言的对象继承机制。与 Java 语言通过类实现代码封装不同JavaScript 语言中没有“类”的概念。函数、对象等数据结构都继承自原型对象 Object。每个对象实例都有两个特殊属性prototype和__proto__。其中__proto__属性指向该对象实例的原型对象即它继承自哪个对象而prototype属性则指向原型对象的构造方法。当访问一个对象的属性时如果在该对象实例本身没有找到该属性JavaScript 引擎就会通过__proto__属性沿着原型链向上查找依次在它的原型对象中搜索直到查找到最底层的Object对象其__proto__属性为null。因此JavaScript 对象的属性查找过程形成了一条原型继承链。在上面的示例中执行过代码之后如果查看o3的原型那么就会看到Object对象被添加了b属性。console.log(o3.__proto__)// [Object: null prototype] { b: 2 }因所有对象都继承自原型对象Object那么后续创建的其他对象也会具有b属性consto4function(){};classo5extendso4{};console.log(o4.b)//2console.log(o5.b)//2此过程中原型链Prototype Chain如下o5.proto-- Function: o4.proto-- {}.proto-- Object:null防御方法避免直接操作proto或原型对proto或 constructor 进行过滤。// 安全做法避免动态设置 __proto__functionsafeMerge(target,source){for(constkeyinsource){if(key__proto__||keyconstructor){continue;// 忽略敏感属性}target[key]source[key];}}使用 Object.create(null) 创建无原型对象这种方法创建的对象不继承Object.prototypeconstsafeObjObject.create(null);// 无原型链safeObj.nameSafe;console.log(safeObj.toString);// undefined无法访问 Object.prototype 的方法冻结原型对象// 冻结 Object.prototypeObject.freeze(Object.prototype);// 尝试污染原型会失败严格模式下报错Object.prototype.isAdmintrue;console.log(Object.prototype.isAdmin);// undefined安全处理对象合并操作在合并对象属性时过滤敏感键如proto、constructor、prototype。functionsafeAssign(target,source){Object.keys(source).forEach(key{if(keyinObject.prototype)return;// 忽略原型上的键target[key]source[key];});}使用 Map 替代普通对象constmapnewMap();map.set(isAdmin,true);console.log(map.get(isAdmin));// trueconsole.log(map.isAdmin);// undefined无法通过原型链污染使用安全的第三方库避免手写不安全的对象操作选择经过安全审计的库如 Lodash 的 _.merge 默认过滤原型键。onst _require(lodash);constsafeObj_.merge({},maliciousPayload);// 自动忽略 __proto__启用严格模式Strict Mode关键点严格模式下修改只读属性如冻结后的原型会抛出错误。use strict;Object.prototype.isAdmintrue;// 报错Cannot add property isAdminSchema validation of JSON inputNPM 上有多个库例如 ajv为 JSON 数据提供了模式验证功能。可以在 JSON Schema 规则中添加additionalProperties: false来禁止额外的属性。结合最开始的例子关键代码let o2 JSON.parse({a: 1, __proto__: {b: 2}})之所以使用JSON.parse()的方式构造对象是因为如果直接写作o2 {a: 1, __proto__: {b: 2}}会把o2的__proto__直接赋值为{b: 2}而不是在o2指向的原型对象中添加属性。通过 JSON Schema 验证模式可以阻断这种绕过过程防止恶意属性的添加。扩展阅读[1] JS应用安全漏洞利用详解从原型链污染到全栈RCE[2] Prototype pollution[3] 什么是原型污染如何防止原型污染
RELATED

相关推荐

【维克】t分布与对数正态分布:金融数据为什么总是“不正常“?

【维克】t分布与对数正态分布:金融数据为什么总是“不正常“?

WHY:上一篇说完正态分布的"迷人假设",今天我们聊聊现实 上一篇我讲了正态分布在金融世界的统治地位——优雅、好用、但致命地低估了尾部风险。文章结尾留了个问题:既然正态分布不够用,那用什么替代? 答案不…

📅 2026/8/24 1:27:58
HarmonyOS7 状态管理全家桶:@State、@Prop、@Link 到底怎么选?

HarmonyOS7 状态管理全家桶:@State、@Prop、@Link 到底怎么选?

文章目录前言为什么状态管理这么头疼三种装饰器对比场景一:父子单向传递(Prop)场景二:父子双向同步(Link)场景三:跨层级传递(Provide Consume)场景四:列表中…

📅 2026/9/21 14:29:09
从零设计一套可复用的 Unity 手游框架:CGHGameFramework 架构实践

从零设计一套可复用的 Unity 手游框架:CGHGameFramework 架构实践

从零设计一套可复用的 Unity 手游框架:CGHGameFramework 架构实践标签: Unity 游戏框架 热更新 MMORPG 客户端架构 适合读者: Unity 中高级客户端、主程/技术负责人、准备搭自研框架的同学 说明: 本文基于本人主导落地的 CGHG…

📅 2026/8/24 1:28:00
MORE NEWS

更多资讯

📰

大模型产品负责人的真实压力与破局路径

我无法根据您提供的输入内容生成符合要求的博文。原因如下:项目标题“Qwen新1号位首次亮相,刘大一恒能否顶住压力?”属于人物动态类媒体话题,明显指向某次公开活动、组织任命或行业报道中的角色更替事件;但项目正文为空…

📰

未来十年就业率高的四大专业方向:AI、医疗、新能源与智能制造

每年填报季还没到,我就开始收到朋友和读者家长的消息,问的基本都是同一句话:哪个专业以后好找工作,你给个准话。这类问题我一般不会一上来就报专业名字,而是会先反问三个问题:孩子数学和物理能扛到什么程度…

📰

BP-Adaboost:用BP神经网络作为弱学习器的集成方法

简介:本资源是一个基于C#实现的BP-AdaBoost集成学习算法项目,面向机器学习初学者与Windows平台开发者,聚焦于强分类器构建与预测任务,特别适用于皮肤病变等二分类场景的建模实践。压缩包共46个文件,包含7个C源码&#…

📰

Java核心基础拆解:从JDK配置到高频面试题的系统学习路线

1. 把Java核心基础拆开看:它在学什么,为什么面试总绕不开先说个我观察到的现象:只要你在搜索引擎里敲下“Java”三个字,下拉联想永远是“Java基础”“Java面试题”“Java学习路线”“Java八股文”这几个词轮番出现。这说明什么&am…

📰

人才盘点岗位能力拆解:数据分析、九宫格模型和Excel的优先级怎么排

截至2026年9月秋招季,人才盘点岗位对校招生的硬性能力门槛是Excel数据处理加对九宫格、360评估等方法论的基本理解,数据分析能力是面试中区分度最高的考察项,直接问工具操作细节的面试题正在增多。 智联招聘2026年9月发布的一份组织发展管培生…

📰

旅游社交小程序源码实战:从部署排错到答辩改造的毕业设计指南

简介:这是一份面向计算机相关专业毕业设计的旅游社交小程序完整源码,基于Java后端与Vue前端技术栈,涵盖用户社交、景点推荐、游记发布等典型模块,经导师指导并获98分评价,适合需要项目实战练习或完成课程设计的学生参考…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬