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] 什么是原型污染如何防止原型污染

相关新闻

Spring Boot 接口幂等实战:用 Token + Redis 防重复提交

Spring Boot 接口幂等实战:用 Token + Redis 防重复提交

Spring Boot 接口幂等实战:用 Token Redis 防重复提交 用户手抖双击了「提交订单」,或者网络卡了页面转圈他又点一次,结果后台生成了两条一模一样的订单。这是几乎每个交易类接口都要面对的问题:同一个业务操作被重复执行。前端加个 loading 禁用按钮只能挡君子,挡不住重发请求…

2026/7/23 22:49:43阅读更多 →
Next.js 图片优化实战:next/image 的 sizes、priority 与 CLS 修复

Next.js 图片优化实战:next/image 的 sizes、priority 与 CLS 修复

Next.js 图片优化实战:next/image 的 sizes、priority 与 CLS 修复 页面加载时图片「跳一下」,把下面的文字往下顶——这就是 CLS(累积布局偏移),Lighthouse 里扣分最狠的指标之一。用 Next.js 的人常以为把 <img> 换成 next/image 就万事大吉,结果打开控制台一看:图片还…

2026/7/23 22:49:43阅读更多 →
Trove 付费资源社区源码 + 个人博客 + 短视频 APP 支持 AI 大模型多支付多存储

Trove 付费资源社区源码 + 个人博客 + 短视频 APP 支持 AI 大模型多支付多存储

简介&#xff1a; Trove 付费资源社区源码 个人博客 短视频 APP 支持 AI 大模型多支付多存储 支持发布为H5/安卓/苹果/小程序&#xff0c;后端采用今天刚发布的RuleApiV2的Pro体验版&#xff0c;可以帮助您快速搭建自己的个人博客&#xff0c;付费资源论坛&#xff0c;短视…

2026/7/23 22:49:43阅读更多 →
影刀RPA 自动化舆情监控:关键词预警与报告生成

影刀RPA 自动化舆情监控:关键词预警与报告生成

影刀RPA 自动化舆情监控&#xff1a;关键词预警与报告生成 作者&#xff1a;林焱 写在前面 品牌负面舆情一旦爆发&#xff0c;几个小时内可能蔓延全网。靠人工每天刷微博、知乎、新闻&#xff0c;根本来不及。影刀可以帮你搭一套724小时的舆情监控系统&#xff1a;定时采集多…

2026/7/24 0:12:08阅读更多 →
ArkUI Provider 和 Consumer 乱用怎么办:中式美食同类多层筛选页为什么别一路传参数

ArkUI Provider 和 Consumer 乱用怎么办:中式美食同类多层筛选页为什么别一路传参数

先把相关概念说清楚知识点在这个问题里怎么看自定义组件冻结功能用来写多页面栈、TabContent、LazyForEach 和 BuilderNode 混用时的刷新边界状态管理 V1 向 V2 迁移用来拆 State 到 Local、Param、Once、Event 的迁移判断Provider / Consumer用来解释跨层级双向同步&#xff0…

2026/7/24 0:12:08阅读更多 →
【K8S 运维实战】11-资源管理Requests与Limits

【K8S 运维实战】11-资源管理Requests与Limits

资源管理:Requests/Limits 与 QoS 分级 一句话定位:为什么设了 Limits 还是被 OOM QoS 三级怎么用 ResourceQuota 实战。 写在前面 “我明明设了 memory limit 4G,Pod 还是 OOMKilled 了,这是什么玄学?”——这是我遇到过最经典的资源管理困惑。还有一类:“节点资源没用满,…

2026/7/24 0:12:08阅读更多 →
《你别回头找我》为何能成为可传播的试听入口

《你别回头找我》为何能成为可传播的试听入口

《你别回头找我》写的是一种状态&#xff1a;《你别回头找我》把“你别”写成可听见的状态&#xff1a;拒绝有时是对自己的保护。听的人多半不是旁观&#xff0c;而是刚好走在同类路口&#xff0c;更适合的播放场是关掉通知、拒绝一次聚会、把话说断的路口。场景立住&#xff0…

2026/7/24 0:12:08阅读更多 →
业务分析岗位适合考哪些证书?懂业务也要懂工具和AI

业务分析岗位适合考哪些证书?懂业务也要懂工具和AI

业务分析岗位的核心价值是“把业务问题翻译成数据问题&#xff0c;再把数据结论翻译回业务决策”。以下五类证书&#xff0c;对应业务分析不同维度的能力需求。一、数据分析类认证——指标、报表和业务洞察业务分析的基础是“看懂数据”。CDA认证是国内参与人数最多的数据分析认…

2026/7/24 0:10:08阅读更多 →
OpenClaw+Kimi K2.5+Moltbook企业级AI工作流部署指南

OpenClaw+Kimi K2.5+Moltbook企业级AI工作流部署指南

1. OpenClawKimi K2.5Moltbook部署方案概述这个组合堪称当前最强大的AI工作流解决方案之一。OpenClaw作为自动化控制中枢&#xff0c;Kimi K2.5提供核心AI能力&#xff0c;Moltbook则负责交互界面呈现。三者的结合可以打造出一个智能程度极高的工作助手系统。我在实际部署过程中…

2026/7/24 0:10:08阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中&#xff0c;我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源&#xff0c;还是配置文件、证书等&#xff0c;都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下&#xff0c;但这…

2026/7/23 0:56:31阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP&#xff08;轻量级目录访问协议&#xff09;作为企业级身份认证的黄金标准&#xff0c;已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时&#xff0c;发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/23 0:56:31阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”&#xff0c;而是以可解释、可审计、可迭代的方式&#xff0c;赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 0:56:31阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好&#xff0c;我是一名编程初学者&#xff0c;同时这也是我编程学习之路上的第一篇博客。在这里&#xff0c;我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手&#xff0c;目前在学习c语言&#xff0c;我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:06阅读更多 →
【LeetCode 54】螺旋矩阵

【LeetCode 54】螺旋矩阵

问题描述&#xff1a; 解法&#xff1a; 1、模拟&#xff08;参考自【LeetCode 54】螺旋矩阵-CSDN博客&#xff09; int *spiralOrder(int **matrix, int matrixSize, int *matrixColSize, int *returnSize) {static const int dirs[4][2] {{0, 1}, {1, 0}, {0, -1}, {-1, …

2026/7/24 0:00:06阅读更多 →
2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

知春路不相信模型领先今年WAIC大会&#xff0c;昔日AI六小龙来了五家&#xff0c;分别是Kimi、阶跃星辰、Minimax、百川智能、零一万物。连放弃基模的百川和零一万物都来了&#xff0c;唯一缺席的竟是近几个月来风光无限的智谱。&#xff08;DeepSeek一直不参加&#xff09;WAI…

2026/7/24 0:00:06阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时&#xff0c;发现推理速度只有可怜的 1-2 FPS&#xff0c;而别人的演示视频却能跑到 30 FPS 以上&#xff0c;那么问题很可能不在模型本身&#xff0c;而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后&#xff0c;会直接使用官方示例…

2026/7/23 22:58:43阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一&#xff1a;为什么你需要了解 Coze 和 Dify&#xff1f;如果你对 AI 应用开发感兴趣&#xff0c;但一看到“大模型”、“智能体”、“工作流”这些词就头疼&#xff0c;觉得门槛太高&#xff0c;那这篇文章就是为你准备的。很多开发者&#xff0c;包括我自己&#…

2026/7/23 18:58:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会&#xff1a;配图一直是个让人头疼的问题。2026年&#xff0c;AI生图工具已经非常成熟了&#xff0c;但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1&#xff1a;速度之王2026年6月11日&#xff0c…

2026/7/23 18:58:18阅读更多 →