如何阻止WooCommerce网站遭机器人垃圾GET过滤请求攻击?
我之前帮几个WooCommerce用户解决过几乎一模一样的问题——这种遍历分层导航过滤参数的机器人真的烦,换IP绕封禁还触发超大的缓存更新查询,把磁盘和服务器资源都占满。下面是几个通用的多层防护方案,从应用层到服务器层联动,比单纯封IP靠谱多了:
1. WooCommerce应用层限制
先从源头减少这类请求的影响,同时拦截异常请求:
延长分层导航缓存有效期:机器人反复请求会强制刷新WooCommerce的分层导航计数缓存(就是你日志里的
_transient_wc_layered_nav_counts_*),把缓存时间拉长能大幅减少数据库更新次数。在主题的functions.php里加这段代码:add_filter( 'woocommerce_layered_nav_counts_transient_expiration', function() { return 86400; // 缓存1天,默认是几小时,可按需调整 } );添加请求频率限制:针对带
filter_参数的请求,用临时缓存记录请求次数,超过阈值就返回403。同样在functions.php里加:add_action( 'template_redirect', 'block_excessive_filter_requests' ); function block_excessive_filter_requests() { if ( isset( $_GET ) && !empty( array_filter( array_keys( $_GET ), function( $key ) { return str_starts_with( $key, 'filter_' ); } ) ) ) { // 用请求的URI+参数作为唯一标识 $request_key = md5( $_SERVER['REQUEST_URI'] ); $request_count = get_transient( 'filter_req_' . $request_key ); if ( $request_count && $request_count > 5 ) { wp_die( 'Too many requests', 'Forbidden', 403 ); } set_transient( 'filter_req_' . $request_key, ( $request_count ?: 0 ) + 1, 60 ); // 1分钟内限制5次 } }
2. Apache服务器层拦截
利用Apache的模块直接拦截符合特征的恶意请求,效率比应用层更高:
拦截参数异常的请求:机器人会一次性传多个过滤选项(比如
flavor1,flavor2,...,flavor15),可以直接拦截逗号数量过多的请求。在.htaccess里加:# 拦截filter参数值包含超过5个逗号的请求 RewriteCond %{QUERY_STRING} filter_[^=]+=([^&]*),([^&]*),([^&]*),([^&]*),([^&]*),([^&]*) [NC] RewriteRule ^product-category/ - [R=403,L]速率限制拦截:用
mod_evasive模块(需要先安装)针对过滤请求做频率限制,比如1分钟内同一个IP请求超过5次就封禁10分钟。在Apache配置或.htaccess里加:<LocationMatch "^/product-category/.+\?filter_"> DOSHashTableSize 3097 DOSPageCount 5 # 1分钟内同一页面最多5次请求 DOSSiteCount 10 # 1分钟内同一IP最多10次站点请求 DOSPageInterval 60 # 统计窗口1分钟 DOSSiteInterval 60 DOSBlockingPeriod 600 # 封禁10分钟 </LocationMatch>拦截无Referer/异常UA的请求:很多机器人不带Referer或者用异常的User-Agent,可针对性拦截:
# 拦截无Referer的filter请求 RewriteCond %{QUERY_STRING} filter_ [NC] RewriteCond %{HTTP_REFERER} ^$ RewriteRule ^product-category/ - [R=403,L] # 拦截常见恶意UA(可自行补充) RewriteCond %{HTTP_USER_AGENT} (bot|crawler|spider) [NC] RewriteCond %{QUERY_STRING} filter_ [NC] RewriteRule ^ - [R=403,L]
3. 数据库层优化(降低慢查询影响)
即使有漏网的请求,也要减少对数据库的冲击:
给wp_options表加索引:如果你的
wp_options表没有针对option_name的索引,执行这条SQL(替换表前缀):CREATE INDEX idx_option_name ON wp_options(option_name);这能加快缓存更新的查询速度,减少锁表时间。
清理超大缓存记录:如果已经有很大的
_transient_wc_layered_nav_counts_*记录,可以手动删除:DELETE FROM wp_options WHERE option_name LIKE '_transient_wc_layered_nav_counts_%';
4. 机器人合规性拦截(辅助手段)
虽然机器人可能无视,但还是可以在robots.txt里明确禁止这类请求:
User-agent: *
Disallow: /product-category/?filter_
另外,给分层导航页面添加隐形CAPTCHA(比如reCAPTCHA v3),只有通过验证的请求才处理过滤逻辑,大部分自动化机器人会被拦截。可以用WooCommerce的官方reCAPTCHA插件实现。
内容的提问来源于stack exchange,提问作者aoa

