报错是这么冒出来的。站内搜索页的 title 直接拼了 q 参数,有人用脚本提交了几万个垃圾词组合,这些页面被收录后,搜索结果里出现大量带博彩词的标题,站点被判垃圾内容。

中间走过弯路,把「页面返回 200 且没有 noindex,被蜘蛛全部抓走」当成主因,改完现象没变。

原因不止一个,得分开看。title 未做长度限制和字符过滤,直接回显参数。还有一种是搜索页允许匿名访问且没有频率限制。

不容易想到的是,搜索结果为空时仍渲染完整页面。

复现参数注入的效果

curl -s 'https://www.example.com/search?q=%E5%8D%9A%E5%BD%A9' | grep -o '<title>[^<]*'

给 title 做截断和转义

echo htmlspecialchars(mb_substr($q, 0, 20));

搜索页统一输出 noindex

curl -sI 'https://www.example.com/search?q=test' | grep -i x-robots

剩下的就是对空结果和异常参数返回 404

if (mb_strlen($q) > 30) { http_response_code(404); exit; }

别只看报错消失,验证要多做一步。注入词不再出现在 title 里,搜索页全部带 noindex,已收录的垃圾页两周内从索引中清除。

搜索页回显参数一定要限长和转义,索引被垃圾词占满后清理周期很长,提前挡住成本最低。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189