根据 QUERY_STRING 拒绝访问该网站

根据 QUERY_STRING 拒绝访问该网站

我的网站“受到攻击”:来自许多不同 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 评论(检查日志并查看是否RewriteEngineon,唯一可能出错的是正则表达式。尝试删除 ():

RewriteCond %{QUERY_STRING} ^.*spamword.*$

相关内容