如何高效实现敏感信息过滤并避开常见坑点

诸葛佳宜 优化 阅读 2,796
赞 30 收藏
二维码
手机扫码查看
反馈

我的写法,亲测靠谱

最近在项目里处理敏感信息过滤,折腾了好几轮,终于整理出一套还算顺手的方案。说真的,这个需求乍一看挺简单,但实际操作起来坑真不少。

如何高效实现敏感信息过滤并避开常见坑点

先上核心代码吧:

function filterSensitiveData(input, sensitiveWords) {
  const wordRegex = new RegExp(sensitiveWords.map(word => word.replace(/[-/\^$*+?.()|[]{}]/g, '\$&')).join('|'), 'gi');
  return input.replace(wordRegex, match => '*'.repeat(match.length));
}

// 使用示例
const sensitiveWords = ['password', 'token', 'secret'];
const logMessage = "User token: abc123, password: qwerty";
console.log(filterSensitiveData(logMessage, sensitiveWords));
// 输出:User ****: abc123, ******: qwerty

我选择这种方式有几个原因。首先,用正则表达式可以一次性匹配多个敏感词,性能比循环判断要好。其次,replace方法可以直接替换匹配到的内容,写法简洁明了。最后,使用’*’来替换原始内容长度保持一致,既保护了数据又保留了格式参考。

这几种错误写法,别再踩坑了

分享几个我在项目中遇到的反面教材,真的是血泪教训啊。

第一个常见错误是直接硬编码敏感词:

// 反面案例
if (input.includes('password')) {
  input = input.replace('password', '******');
}

这种写法问题太多了。首先是维护性差,每次新增敏感词都要改代码。其次是容易遗漏大小写变体,比如Password和PASSWORD就过滤不掉。

第二个坑是滥用全局变量:

// 反面案例
window.sensitiveWords = ['password', 'token'];
function filter(input) {
  window.sensitiveWords.forEach(word => {
    input = input.replace(new RegExp(word, 'g'), '***');
  });
  return input;
}

这样写看似方便,但把配置放在全局变量里太危险了。我之前就遇到过其他模块不小心覆盖了这个变量,导致整个过滤功能失效。

第三个大坑是忽略特殊字符处理:

// 反面案例
const regex = new RegExp(sensitiveWords.join('|'), 'gi');

这段代码看着没问题,但如果敏感词里包含正则特殊字符(比如括号、星号等),就会报错或者行为异常。一定要记得对每个词进行转义处理。

实际项目中的坑

在真实项目中,有几点特别需要注意。首先是性能问题,尤其是日志量大的时候。我之前在一个高频打日志的服务里用同步方式处理,结果CPU占用飙得老高。后来改成异步队列处理才解决:

// 优化后的异步处理
const processQueue = [];
setInterval(() => {
  while (processQueue.length) {
    const { input, callback } = processQueue.shift();
    callback(filterSensitiveData(input, sensitiveWords));
  }
}, 100);

function asyncFilter(input, cb) {
  processQueue.push({ input, callback: cb });
}

另一个要注意的是边界情况。比如有些字段虽然包含敏感词,但其实是安全的。我就遇到过这种情况:

// 需要放行的特殊情况
const safeFields = ['password_strength', 'reset_password_token'];
function shouldFilter(fieldName, value) {
  if (safeFields.includes(fieldName)) return false;
  return true;
}

还有就是国际化问题,不同语言的敏感词处理起来差别很大。英文还好,中文更复杂,要考虑词语边界和上下文。我现在一般会额外加个分词库来处理中文场景。

以上是我总结的最佳实践

其实敏感信息过滤这个需求,看起来简单,但要做好还真不容易。既要考虑性能,又要兼顾准确性,还得处理各种边界情况。我现在的这套方案也不是完美无缺,但在实际项目中已经够用了。

最后提醒一下,建议定期审查和更新敏感词列表。毕竟业务在发展,可能出现新的需要保护的信息类型。更好的方案欢迎评论区交流,咱们一起进步。

本文章不代表JZTHEME立场,仅为作者个人观点 / 研究心得 / 经验分享,旨在交流探讨,供读者参考。
发表评论

暂无评论