当前位置: 首页 > news >正文

别再无脑用 `JSON.parse()` 了!这个安全漏洞你可能每天都在触发

你以为只是解析个字符串?其实黑客已经在你服务器上跑脚本了!

在前端和 Node.js
开发中,JSON.parse()
几乎无处不在:

const data = JSON.parse(localStorage.getItem('user')); const config = JSON.parse(req.body.payload); const settings = JSON.parse(fs.readFileSync('config.json'));

简洁、直接、好用——但极其危险

如果你没有对输入做任何校验就调用JSON.parse(),你正在为应用打开一扇“任意代码执行”的后门。

今天,我们就来揭开JSON.parse()背后的安全雷区,并告诉你如何用更安全、更现代的方式处理 JSON 数据。

危险场景一:
原型污染(Prototype Pollution)

这是JSON.parse()最臭名昭著的安全漏洞之一。

虽然原生JSON.parse()本身不会执行代码,但它会忠实地还原对象结构——包括__proto__constructor.prototype这类特殊属性。

来看一个真实攻击载荷:

const userInput = '{"__proto__":{"isAdmin":true}}'; const obj = {}; JSON.parse(userInput, (key, value) => { obj[key] = value; return value; }); console.log({}.isAdmin); // true!全局对象被污染!

如果这段代码出现在你的登录逻辑、权限校验或配置合并中,攻击者就能:

  • 绕过身份验证(isAdmin: true);
  • 注入恶意属性(如exec: 'rm -rf /');
  • 篡改全局行为,导致服务崩溃或数据泄露。
尤其在使用 Lodash、merge、assign 等工具库时,风险更高!

危险场景二:拒绝服务( DoS

恶意构造的 JSON 字符串可导致内存爆炸CPU 耗尽

// 深度嵌套攻击 const evil = '{"a":{"a":{"a":{"a":{"a":{"a": ... }}}}}}'; // 或超大数组 const evil2 = '[1,1,1,...,1]' // 1000 万个元素

调用JSON.parse(evil)可能:

  • 占用数 GB 内存;
  • 阻塞事件循环数秒;
  • 直接触发 OOM(Out of Memory)崩溃。

在 API 接口或 Webhook 处理中,这等于把“关机按钮”交给了攻击者。

正确姿势:安全解析 JSON 的三重防护

第一步:限制输入大小

在解析前先检查字符串长度:

function safeParse(str, maxSize = 1024 * 100) { // 100KB if (typeof str !== 'string' || str.length > maxSize) { throw new Error('Input too large'); } return JSON.parse(str); }

第二步:禁用危险键(如__proto__

使用reviver函数过滤敏感属性:

function secureJSONParse(str) { return JSON.parse(str, (key, value) => { if (key === '__proto__' || key === 'constructor') { throw new Error('Disallowed key in JSON'); } return value; }); }

第三步(推荐):用
Zod / Joi
做运行时校验

这才是现代 JS 工程的最佳实践!

import { z } from 'zod'; const UserSchema = z.object({ id: z.number(), name: z.string(), email: z.string().email(), isAdmin: z.boolean().optional(), }); function parseUser(jsonStr: string) { const raw = secureJSONParse(jsonStr); return UserSchema.parse(raw); // 自动校验 + 类型推导 }

优势:

  • 类型安全(配合 TypeScript 完美);
  • 自动过滤多余字段
  • 明确拒绝非法结构
  • 防止原型污染、字段注入等攻击

特别提醒:Node.js 中的额外风险

在服务端,如果你从以下来源解析 JSON,风险更高:

  • HTTP 请求体(req.body
  • 文件读取(用户上传的 JSON 配置)
  • Redis / 数据库存储的序列化数据
  • 第三方 Webhook 回调

务必在解析前做来源校验 + 结构校验 + 大小限制三重保险!

结语

JSON.parse()不是“坏 API”,但它是一把没有保险的枪
在现代 Web 开发中,信任任何用户输入 = 自毁程序

下次当你写下JSON.parse(someString)时,请自问:

“我确定这个字符串来自可信源吗?它的结构真的安全吗?”

如果答案不确定,请立即切换到Zod / Joi + 安全解析函数的组合。

http://www.jsqmd.com/news/449514/

相关文章:

  • 人工智能+AI的生鲜农产品保鲜及溯源商城管理系统vue
  • VulnHub DC-5 靶机渗透测试笔记
  • 使用CGAL的半边数据结构HalfedgeDS_list构建一个立方体
  • ez-rce
  • [AI-Talk] OpenClaw如何实现直播评论
  • AI助教新实践:Nanbeige 4.1-3B实现自动化作业批改与反馈
  • 人工智能+AI的微信小程序的考研交流系统
  • nanobot效果展示:Qwen3-4B在Chainlit中解析图片URL、执行shell命令案例
  • CosyVoice-300M Lite应用分享:无障碍服务中的语音导航实现
  • 撤销工作表保护密码破解/工作簿密码破解,考勤表无法编辑?考勤表无法修改?有办法找回密码。
  • Qwen1.5-1.8B GPTQ一键部署体验:对比重装系统与镜像部署效率
  • 为什么有人连操作系统的基本知识都不懂?
  • 【UI自动化测试】1_TPshop项目实战 _项目介绍(重点)
  • 基于声波,超声波和振动传感器三位一体的多模态变电站出厂检测有市场吗?
  • 微信私域自动化
  • 万象熔炉 | Anything XL效果展示:多光源场景下阴影过渡与材质反射效果
  • 智慧物流已成标配:2026年主流AGV叉车厂家市场竞争力和行业格局全景解析 - 品牌推荐
  • 题解:CF2201B Recollect Numbers
  • 2026年制造业选型必看:AMR搬运机器人厂家适配指南与核心指标实测对比 - 品牌推荐
  • 小白也能搞定:ResNet18通用物体识别镜像一键部署指南
  • 基于声波,超声波和振动传感器三位一体的多模态变电站出厂检测市场前景
  • 基于 Qt 实现多客户端 TCP 通信聊天室
  • 全文搜索终极对决:Elasticsearch与Solr核心选型指南
  • 2026年AMR搬运机器人厂家权威榜单发布:五大品牌技术实力深度排位赛 - 品牌推荐
  • 阿里MGeo模型实战:10分钟学会地址匹配,告别人工比对
  • 2026年制造企业选型必看:AGV叉车厂家选购指南与四大核心能力实测 - 品牌推荐
  • 2026年AMR搬运机器人厂家深度测评:基于导航精度与交付效率的五维战力解析 - 品牌推荐
  • Gemini如何解决办公难题:从“工具”到“协作者”的认知升级
  • 用Wan2.2-T2V-A5B做教育动画:自动生成教学演示小片段
  • Qwen3-TTS-VoiceDesign开源镜像实操手册:免配置Docker化部署+Gradio Web快速体验