我的网站“受到攻击”:来自许多不同 IP 的机器人正在用垃圾内容填写表格。
IP 地址无法被过滤,它们总是不同的,所以我考虑通过 QUERY_STRING 进行过滤,以匹配这样的 URI:
www.site.com/search?field1=spamword&field2=another_spamword
规则 :
rewritecond %{QUERY_STRING} ^(.*)spamword(.*)$
rewriterule .* - [F,L]
正则表达式看起来正确,但规则从未执行。知道发生了什么吗?
谢谢。
答案1
我无法启用重写日志,因此我找到了另一种方法,并直接在所有页面上使用表单执行此操作:
if ( strlen( $_SERVER['REQUEST_URI'] )>650 ) {
header('HTTP/1.0 401 Unauthorized');
.. error message to not panic real users ...
exit;
}
因为我发现(查看访问日志并考虑表单字段)长度超过 650 个字符的 URL 永远不是有效请求。(平均大小为 4-6 Kb)
遗憾的是,正则表达式问题仍然存在,并且无法解决。但至少问题已得到部分解决(机器人仍然存在,但页面使用很少的资源,因为没有进行任何查询)
幸运的是,机器人会识别 401 错误并停止。
答案2
除了 @Wrikken 评论(检查日志并查看是否RewriteEngine
)on
,唯一可能出错的是正则表达式。尝试删除 ():
RewriteCond %{QUERY_STRING} ^.*spamword.*$