登录
首页 >  文章 >  前端

使用正则表达式对 JSON 字符串中的敏感字段进行脱敏,可以按照以下步骤操作:✅ 1. 确定需要脱敏的字段例如:"password", "phone", "id" 等。✅ 2. 编写正则表达式匹配字段假设 JSON 格式为:{ "username": "admin", "password": "123456", "phone": "13800000000" }目标是将 password

时间:2026-05-13 22:51:28 390浏览 收藏

本文深入探讨了如何在不解析JSON结构的前提下,安全高效地使用正则表达式对原始JSON字符串中的敏感字段(如password、phone、idCard、email等)进行精准脱敏,既适用于日志预处理、网关过滤等轻量场景,又通过惰性匹配、多类型值识别、注释预清理、转义字符兼容及格式保留等关键技巧规避常见陷阱,帮助开发者在兼顾性能与安全的同时,避免误匹配、格式破坏和数据泄露风险。

如何利用正则表达式实现对原始 JSON 字符串中敏感字段的正则脱敏

直接对原始 JSON 字符串(未解析为对象)用正则表达式脱敏,是可行但需谨慎的方案——适用于无法或不希望解析 JSON 的轻量场景(如日志预处理、网关层快速过滤),但必须避开 JSON 结构陷阱(如嵌套、引号转义、字段名重复等)。核心思路是:**精准匹配键名 + 安全捕获值 + 保留原始格式**。

识别敏感字段的键值对模式

不能简单写 "phone": "138...",因为 JSON 中键名和值可能跨行、含空格、有转义引号。推荐使用惰性匹配 + 带边界的模式:

  • 基础结构"\s*(phone|idCard|email|password)\s*"\s*:\s*("([^"\\]|\\.)*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+-]?\d+)?)
  • 说明:匹配双引号包裹的敏感键名(忽略周围空白),冒号后允许空白,再匹配字符串(支持转义)、布尔、null 或数字;用非贪婪 [^"\\]* 防止跨字符串误匹配
  • 注意:不匹配单引号 JSON(非标准),也不处理键名带转义(如 "\"phone\""),这类极少,若存在需前置预清理

对不同值类型执行差异化脱敏

值的类型决定脱敏方式,正则需分组捕获并判断:

  • 字符串值(第3组匹配内容):保留开头2位 + "****" + 末尾1位(如 "138****0001");邮箱可留用户名首尾+域名("u***@domain.com"
  • 数字/布尔/null:数字可替换为 0***;布尔统一为 false;null 保持不变或替为 null
  • 实现提示:在 replace 回调中用 if (match[3]) {...} 判断是否为字符串,避免误脱敏数字

规避 JSON 结构风险的关键细节

原始字符串操作易出错,以下三点必须处理:

  • 跳过注释与字符串内内容:JSON 标准无注释,但实际日志中可能出现 ///* */。若存在,需先移除注释(用正则 /\/\*[\s\S]*?\*\/|\/\/.*/g),否则可能把注释里的 "phone" 当成字段脱敏
  • 防止匹配到值中的键名:例如 "content": "user phone: 138..."。通过要求键名前后必须是 " + 空白 + :(即 "\s*key\s*"\s*:)来降低误伤
  • 保留原始缩进与换行:replace 时用 $&(整个匹配)做占位,只替换值部分,确保 JSON 格式不变,利于后续解析或展示

一个可用的 JavaScript 示例

以脱敏 phoneidCardemail 为例:

const sensitiveKeys = ['phone', 'idCard', 'email'];
const pattern = new RegExp(
  '"\\s*(' + sensitiveKeys.join('|') + ')\\s*"' +      // 匹配键
  '\\s*:\\s*' +                                        // 冒号及空格
  '(' +                                                // 值(捕获组2)
    '"([^"\\\\]|\\\\.)*"' +                            // 字符串(支持转义)
    '|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+-]?\\d+)?' + // 其他字面量
  ')',
  'g'
);
<p>function desensitizeJSON(jsonStr) {
return jsonStr.replace(pattern, (match, key, value) => {
if (value.startsWith('"')) {
const inner = value.slice(1, -1); // 去掉引号
let masked;
if (key === 'phone') masked = inner.length > 4 ? inner.substring(0, 3) + '<strong><strong>' + inner.slice(-1) : '</strong></strong>';
else if (key === 'idCard') masked = inner.length > 16 ? inner.substring(0, 4) + '<strong>****</strong>' + inner.slice(-4) : '<strong>****</strong>';
else if (key === 'email') {
const [user, domain] = inner.split('@');
masked = user ? (user[0] + '<strong><em>@' + (domain || '')) : '</em></strong>@<strong><em>';
}
return <code>"${key}": "${masked}"</code>;
}
return `"${key}": "</em></strong>"`; // 非字符串值统一掩码
});
}</p>

理论要掌握,实操不能落!以上关于《使用正则表达式对 JSON 字符串中的敏感字段进行脱敏,可以按照以下步骤操作:✅ 1. 确定需要脱敏的字段例如:"password", "phone", "id" 等。✅ 2. 编写正则表达式匹配字段假设 JSON 格式为:{ "username": "admin", "password": "123456", "phone": "13800000000" }目标是将 password 和 phone 脱敏为 **** 或 ***。✅ 3. 正则表达式示例(以 Python 为例)a. 匹配 password 字段import re json_str = '{"username": "admin", "password": "123456", "phone": "13800000000"}' # 替换 password 字段 pattern_password = r'"password"\s*:\s*"([^"]*)"' replaced_json = re.sub(pattern_password, r'"password": "***"', json_str)b. 匹配 phone 字段 pattern_phone = r'"phone"\s*:\s*"([^"]*)"' re》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>