Caddy 默认在 JSON 格式日志中不记录 Cookie 和 Authorization 等敏感请求头,这是最安全可靠的脱敏方式;若使用 common/combined 格式则需手动移除相关模板字段,避免明文泄露。

FrankenPHP 本身不处理日志内容过滤,日志由底层 Caddy 引擎写入,而 Caddy 默认会把原始 HTTP 请求头(包括 Cookie、Authorization)完整记入 access.log。这意味着敏感字段如 session id、JWT、remember_token 等可能明文落盘,构成严重泄露风险。
为什么 Caddy 的 log 指令无法可靠脱敏 Cookie
Caddy v2.8+ 的 log 指令支持 exclude 和 filter,但实际能力有限:
-
exclude只能按路径或状态码粗粒度过滤整条日志,不能按 header 字段选择性隐藏 -
filter需要自定义 Go 插件,Caddy 官方未提供现成的 header 脱敏 filter,且 FrankenPHP 不支持动态加载第三方模块 - 即使写死正则替换(如用
replace替换Cookie:.*),Caddy 日志格式是结构化 JSON 或 Common Log Format,header 值可能被分割、转义或跨行,正则极易失效或误删
真正可行的脱敏方案:在 Caddyfile 中禁用敏感 header 记录
最稳定、无需额外依赖的做法,是让 Caddy 根本不读取或不传递敏感 header 到日志上下文。关键在于控制 log 指令使用的 format 和 output 行为:
- 使用
json格式输出时,Caddy 默认只记录request.headers的白名单字段(如User-Agent、Referer),Cookie和Authorization**默认不包含**——这是安全基线,无需额外配置 - 若你用了
common或combined格式,它会强制拼接%{request.header.Cookie}i这类模板,必须手动删掉;检查你的 Caddyfile 中log块是否含类似字段 - 显式声明精简格式:在
log块中用format json并确保没加include或自定义模板引用敏感 header
示例安全配置片段:
立即学习“PHP免费学习笔记(深入)”;
log {
output file /var/log/frankenphp/access.log {
format json
}
level warn
}
补充加固:用 logrotate + sed 做落地后二次清洗(仅限 debug 场景)
如果因调试需要短期保留原始 header,又不敢信任 Caddy 过滤,可在日志轮转后立即做离线脱敏。这不是实时防护,但可降低磁盘残留风险:
- 修改
/etc/logrotate.d/frankenphp,在postrotate中加入sed -i 's/"Cookie":[^,}]*//g; s/"Authorization":[^,}]*//g' "$1" - 注意:该操作需在
copytruncate后执行,否则会改错文件;且sed -i在某些 busybox 环境不支持,建议用完整 GNU sed - 此法仅适用于低频日志、非生产环境——高并发下
sed -i可能阻塞写入或损坏 JSON 结构
最终效果取决于你是否彻底切断敏感 header 进入日志管道的路径。JSON 格式默认不带 Cookie 是最省心的防线;任何试图在日志生成后再“擦除”的做法,都比不上从源头禁止记录来得干净可靠。



















