必须对日志中敏感字段全局脱敏,因Log::write()不自动过滤password、mobile等字段,需自定义SecureFile处理器递归替换为*,订单日志须按白名单过滤并精准脱敏身份证、手机号等。

日志里直接记录 $request->param() 或 $order->toArray(),等于把密码、手机号、身份证号全裸发到磁盘上——这不是“要不要脱敏”的问题,而是“不脱敏就违规”的事实。
Log::write() 不会自动过滤敏感字段
ThinkPHP 的 Log::write() 是纯搬运工:你给它什么,它就记什么。它不认识模型里的 $hidden = ['password'],也不调用访问器,更不会递归扫描嵌套数组里的 user.token 或 address.phone。
- 常见错误:在控制器里写
Log::write($request->param(), 'info'),结果日志里明文出现"password": "123456" -
$request->param()返回原始数组,和input()行为一致,不做任何清洗 - 文件日志驱动(如
think\log\driver\File)默认不遍历嵌套结构,['user' => ['password' => 'xxx']]会被原样写入 - 中间件拦截无效:命令行、定时任务、异常捕获等场景不走 HTTP 中间件链
用自定义日志处理器做全局脱敏
继承 think\log\driver\File,重写 save() 方法,在数据落盘前统一脱敏,是最可靠的方式。不是所有项目都适合改全局处理器,但登录、支付、用户资料类接口必须这么做。
- 注册方式:
Log::setHandler(new \app\common\log\SecureFile());,放在app/common.php或独立日志配置中 - 脱敏函数必须递归处理,关键词需大小写不敏感匹配:
password、pwd、token、id_card、bank_card、mobile、phone - 优先用
array_walk_recursive(),比手写深度递归更安全,防栈溢出;若需保留键路径(如区分user.phone和order.phone),才用自定义递归 - 脱敏值统一设为
'***'或'[REDACTED]',别用空字符串——后者可能被误认为字段缺失
订单日志必须按结构白名单过滤
订单数据结构复杂,$_POST、ORM 模型、SQL 参数、关联对象都可能含敏感字段。不能靠全量正则扫描日志文本,极易误杀订单号或破坏 JSON 结构。
- 先确认日志来源:是原始请求?模型
toArray()?还是 PDO$params?不同来源要不同策略 - 定义白名单数组:
['phone', 'mobile', 'id_card', 'card_no', 'bank_account', 'address', 'full_address', 'consignee', 'real_name'] - 手机号用
substr_replace($clean, '****', 3, 4)更稳,避免substr()在非 11 位时拼错(如空值、固话、带横杠) - 身份证需区分 15/18 位,且保留原始末位(含 X/x),不要统一转大写再截 ——
substr($id, 0, 6) . '******' . substr($id, -4)是安全底线 - 地址类字段建议保留到区级,门牌号打星:
preg_replace('/(?
Whoops 错误页也要脱敏超级全局变量
开发环境用 PrettyPageHandler 很方便,但生产环境若未禁用,会把 $_POST、$_SERVER、$_ENV 里的敏感值(如 DB_PASSWORD、AWS_SECRET_KEY)全暴露在堆栈页里。
- 必须调用
$handler->blacklist('_POST', 'api_key')、$handler->blacklist('_SERVER', 'DB_PASSWORD')等手动加入黑名单 - 被屏蔽字段值会等长替换为星号(如
"secret123"→"*********"),既隐藏内容又保留长度特征 - 生产环境应禁用
PrettyPageHandler,改用JsonResponseHandler,并设置addTraceToOutput(false)关闭堆栈返回 - 错误日志仍可完整记录到文件,只是不向客户端暴露 —— 这需要同时注册两个处理器:一个给用户看简略 JSON,一个给磁盘写详细记录
真正难的不是写几个 maskPhone() 函数,而是确保所有日志出口(HTTP、CLI、Job、Exception、SQL Log)都经过同一套脱敏逻辑。漏掉任意一个,就等于在合规墙上凿了个洞。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











