背景
项目做完,公司安全测试,说系统有安全漏洞,日志中未对用户信息进行脱敏处理,需要我对手机号进行脱敏处理,至少隐藏四位。锅从天上来,一期的项目的安全漏洞,之前没有安全测试,二期项目结束,测出来了,一脸懵的我~
好学和负责任的我(没办法,后来就算不算是二期项目的锅,我是系统Owner,最后还是算是系统问题),开始找资料怎么修复,网上一堆资料,怕个啥。
过程
项目使用的log4j-1.2.16.jar
浏览了很多网页的我,最后有些难受,脱敏的文章,基本上都是基于logback和log4j2的,关于log4j-1.2.16的,找到可用的文章参考总结为以下3种方法:
- 直接把要打印之前,把内容替换掉,这个可行,但是是个笨方法,要看每条有手机号的日志有哪些,然后去替换,难受呀,代码不美观,工作量多而且有可能会漏掉;
- 把 log4j-1.2.16换成 logback和log4j2,然后再脱敏,工作量同样不小,包名啥的也都不一样,身边的小伙伴建议我不要轻易动这一块,工作量太大,有可能会有大坑;
- 重写过滤器,我查了一些文章,没搞懂;
- 扩展PatternLayout类,具体怎么扩展,看了一下,不明白;
想扩展PatternLayout类,但又不知如何下手的我,后来就去看了log4j-1.2.16.jar的源码,就只修改log4j.properties和新增了一个ExPatternLayout.class(基本上是org.apache.log4j.PatternLayout类的代码,没改几行代码)
正则表达式只对连续11位数字且开头是1的进行处理,连续数字超过11位的不认为是手机号,不处理
代码
package com.xiaoxi.log;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.helpers.PatternConverter;
import org.apache.log4j.spi.LoggingEvent;
/**
* 扩展PatternLayout类
* 日志手机号码脱敏 第1位数字为1 连续 11位数字 第12位非数字 中间4位用*代替
*/
public class ExPatternLayout extends PatternLayout {
private static final String REGEX = "1(\\d{2})\\d{4}(\\d{4})(\\D)";
//$1,$2...是表示的小括号里的内容 $1是第一个小括号里的 ,$2是第2个小括号里的
//$1=(\\d{2}), $2=(\\d{4})
private static final String REPLACEMENT = "1$1****$2";
private StringBuffer sbuf = new StringBuffer(256);
private String pattern;
private PatternConverter head;
PatternLayout patternLayout;
public ExPatternLayout() {