这个坑值得记一笔。站内搜索允许用户输入任意词,WAF 看到 union 和 select 就直接拦,技术类文章里带这些词的搜索页全变成 403,用户以为站挂了。

刚开始盯着「搜索参数没有做白名单过滤,直接把原词送进规则」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。规则只匹配关键词不做上下文判断,正常查询也被命中;拦截返回 403,蜘蛛把整批搜索页记成禁止访问;误拦日志没有单独统计,问题拖了一周才发现。

构造一个正常搜索复现

curl -s -o /dev/null -w '%{http_code}' 'https://www.example.com/?s=union+select'

然后看 WAF 日志里的命中规则

grep -i 'union' /var/log/waf/deny.log | tail -20

给搜索参数加白名单并放行 GET

SecRule ARGS:s '!@rx ^[\w\x{4e00}-\x{9fa5} ]+$' 'id:1001,deny'

等前面都确认过,再对搜索页统一返回 200 加 noindex

add_filter('wp_robots', 'noindex_search');

怎么算真的好了,看的是同一批现象。含 union 的正常搜索返回 200,WAF 只拦真正的注入特征,搜索页不再出现在抓取错误里。

关键词黑名单一定会误伤,参数白名单加语义校验比堆规则更可靠。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189