记录一下那天晚上的排查过程。站点的详情页地址是 /product.php?id=1024,WAF 上线后这批页面在百度全是 403,用户访问正常,因为浏览器带了登录 cookie。
把日志和配置对完,能解释这个现象的基本就这几处。WAF 把 id= 加数字的组合当成 SQL 注入特征。少数情况下是规则只对无 cookie 的请求生效,蜘蛛正好没有 cookie。
不容易想到的是,详情页没有做伪静态,参数直接暴露。
第一件事是用无 cookie 请求复现
curl -s -o /dev/null -w '%{http_code}\n' 'https://www.example.com/product.php?id=1024'
然后在 WAF 里给该路径加例外
curl -s -X POST https://waf.example.com/api/rule -d '{"path":"/product.php","action":"allow"}'
再往下把详情页改成伪静态路径
rewrite ^/product/([0-9]+)/$ /product.php?id=$1 last;
复检百度抓取返回码
grep 'Baiduspider' access.log | awk '{print $9}' | sort | uniq -c
那几天正好在做别的变更,先把时间线对齐才敢动手。
排查用的命令都是临时敲的,没有写成脚本,事后才整理。
别只看报错消失,验证要多做一步。加例外并切到伪静态后,百度对详情页的 403 消失,一周内目录收录恢复。
补一句。参数型详情页在 WAF 面前天然吃亏,能伪静态就伪静态,改不动再谈规则例外。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
