如何高效实现敏感信息过滤并避开常见坑点
我的写法,亲测靠谱
最近在项目里处理敏感信息过滤,折腾了好几轮,终于整理出一套还算顺手的方案。说真的,这个需求乍一看挺简单,但实际操作起来坑真不少。
先上核心代码吧:
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;
}
还有就是国际化问题,不同语言的敏感词处理起来差别很大。英文还好,中文更复杂,要考虑词语边界和上下文。我现在一般会额外加个分词库来处理中文场景。
以上是我总结的最佳实践
其实敏感信息过滤这个需求,看起来简单,但要做好还真不容易。既要考虑性能,又要兼顾准确性,还得处理各种边界情况。我现在的这套方案也不是完美无缺,但在实际项目中已经够用了。
最后提醒一下,建议定期审查和更新敏感词列表。毕竟业务在发展,可能出现新的需要保护的信息类型。更好的方案欢迎评论区交流,咱们一起进步。

暂无评论