讲师中心 微信公众号
AI工具推荐 视频效率加速

JavaScript 中 JSON 怎么在前端安全过滤中剔除不合规的 JSON 键值对

浅明大大_4998

浅明大大_4998

发布时间:2026-08-26 15:15:27

|

172人浏览过

|

来源于php中文网

原创

应先JSON.parse()再白名单校验:定义schema明确字段名、类型及取值范围,遍历schema提取合法属性,同时拦截__proto__等危险键名,前端过滤仅为辅助,后端严格校验才是关键。

javascript 中 json 怎么在前端安全过滤中剔除不合规的 json 键值对

直接用 JSON.parse() 解析不可信的 JSON 字符串存在风险,但“过滤不合规的键值对”不是 JSON 解析层的责任——JSON 本身是纯数据格式,没有“合规性”概念。真正要做的,是在解析后对 JavaScript 对象进行**白名单校验与结构清洗**,而非在 JSON 字符串层面“剔除键值对”。

明确校验目标:只保留预期字段和类型

安全过滤的核心是“最小权限原则”:只接受你明确需要的字段名、允许的值类型(如字符串、数字)、以及可接受的取值范围(如 status 只能是 "active" 或 "inactive")。

  • 不要尝试用正则去删 JSON 字符串里的字段(易出错、破坏结构、绕过校验)
  • 先 JSON.parse() 得到对象,再基于预设 schema 过滤属性
  • 对每个字段做类型检查 + 内容检查(如长度、正则匹配、枚举值)

使用白名单对象结构做安全提取

定义一个只含合法键名的白名单对象,遍历它来构建干净结果,自动忽略所有未知字段:

Feishu calendar sync, local ics to json data for AI agent
Feishu calendar sync, local ics to json data for AI agent

将ICS日历文件转为JSON格式,用于飞书日历导入导出及数据集成。

下载
function safeParseJSON(jsonStr, schema = {}) {
  try {
    const raw = JSON.parse(jsonStr);
    if (typeof raw !== 'object' || raw === null) return {};

    const clean = {};
    Object.keys(schema).forEach(key => {
      if (key in raw) {
        const value = raw[key];
        const type = schema[key].type;
        const validator = schema[key].validate;

        // 类型检查
        if (typeof value !== type && !(type === 'number' && typeof value === 'string' && !isNaN(value))) {
          return;
        }

        // 自定义校验(如邮箱、长度、枚举)
        if (validator && !validator(value)) return;

        clean[key] = value;
      }
    });
    return clean;
  } catch (e) {
    return {}; // 解析失败,返回空对象或抛出自定义错误
  }
}

// 示例调用
const userSchema = {
  name: { type: 'string', validate: v => v.length <= 50 },
  age:  { type: 'number', validate: v => Number.isInteger(v) && v >= 0 && v <= 120 },
  role: { type: 'string', validate: v => ['admin', 'user', 'guest'].includes(v) }
};

const unsafeInput = '{"name":"Alice","age":"30","role":"admin","__proto__":"hack","token":"abc123"}';
const safeUser = safeParseJSON(unsafeInput, userSchema);
// → { name: "Alice", age: 30, role: "admin" }(其他字段被自动忽略)

防范原型污染等高危字段

某些键名(如 "__proto__"、"constructor"、"prototype")在旧版 JS 或不当赋值时可能引发原型污染。即使你不用 Object.assign() 或展开运算符直接合并,也应在 schema 校验前做基础黑名单拦截:

立即学习“Java免费学习笔记(深入)”;

  • 解析后立即检查对象是否含有危险键名,有则删除
  • 推荐用 Object.getOwnPropertyNames() 而非 for...in,避免继承属性干扰
  • 若使用第三方库(如 Lodash),确保版本 ≥4.17.21,已修复相关漏洞

进阶建议:配合 Content-Security-Policy 与后端协同

前端过滤只是最后一道防线:

  • 后端必须做严格校验并返回精简数据,前端不应承担主要过滤责任
  • 通过 CSP 头限制内联脚本和 eval,降低恶意 JSON 触发 XSS 的可能性
  • 对用户可控的 JSON 输入(如配置编辑器),优先使用表单控件而非自由 JSON 文本框

热门AI工具

更多
Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2323

2023.08.11

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

5003

2023.10.09

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

6070

2024.03.19

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

5598

2024.03.22

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

783

2024.05.22

js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

4586

2023.06.20

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

1149

2023.07.04

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

4524

2023.07.04

FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

0

2026.10.08

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.1万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn