JSON.parse 本身无安全防护,安全解析需结合格式校验、try-catch 捕获、结构验证及原型污染防护;必须避免解析非 JSON 数据,优先使用 response.json(),禁用 eval 等危险方式。

JSON.parse 本身不自带安全防护,所谓“安全解析”关键在于提前校验字符串格式、捕获异常、避免执行恶意代码(比如 JSONP 场景下混入 script 标签),而不是靠 parse 方法本身防攻击。
确保输入是合法 JSON 字符串
JSON 格式比 JavaScript 对象字面量更严格:键名必须双引号、不能有尾逗号、不允许 undefined/NaN/函数、禁止单引号。直接传入非标准字符串会抛错。
- 用正则粗筛(仅作快速过滤,不替代 try-catch):
/^\s*[\{\[].*[\}\]]\s*$/s判断是否以 { 或 [ 开头并以 } 或 ] 结尾 - 避免解析用户可控的非 JSON 数据(如 query string、HTML 片段、JS 表达式)
- 后端返回前应明确设置
Content-Type: application/json,前端用response.json()(它内部已封装 try/catch)比手动 parse 更稳妥
必须用 try...catch 捕获解析失败
任何不可信来源的字符串都可能触发 SyntaxError,不捕获会导致脚本中断。
function safeParse(jsonStr) {
try {
const data = JSON.parse(jsonStr);
// 可选:进一步校验结构(如检查 data 是对象且非 null)
if (data && typeof data === 'object') return data;
} catch (e) {
console.warn('JSON 解析失败:', e.message);
}
return null; // 或抛出自定义错误、返回默认值
}
警惕 JSON 中的特殊值与原型污染风险
JSON.parse 不会还原函数、undefined、Date、RegExp 等,但要注意:
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
-
JSON.parse('{"__proto__": {"admin": true}}')在某些老环境(或配合 Object.assign 等操作)可能导致原型污染 —— 解析后应避免直接用Object.assign({}, parsed)合并到空对象 - 如需深度净化,可用库如 json-sanitizer,或手动递归过滤危险键名(
__proto__、constructor、prototype) - 对敏感字段(如 id、role)做白名单校验,不依赖 JSON 内容自述其真实性
不推荐但需了解的“伪安全”做法
以下方式看似增强安全,实际无效或有害:
-
eval('(' + jsonStr + ')'):极度危险,可执行任意代码,绝对禁用 - 用
Function构造函数动态执行:同样绕过 JSON 限制,等同于 eval - 仅靠正则匹配
{.*}就信任字符串:无法识别嵌套结构、转义问题、Unicode 非法字符等
真正安全的解析 = 合法来源 + 严格格式 + 异常捕获 + 结构校验 + 原型防护。JSON.parse 是工具,不是盾牌。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










