如何阻止用户代理访问服务器上所有站点?


9

我最初将此内容发布在webmasters.stackexchange.com上,但被告知我会在这里得到更好的接待。


在过去的几天里,我一直在遭受似乎是(可能是无意间)DDOS攻击的痛苦。我收到了来自代理的大量请求,这些请求被标识为“ Mozilla / 4.0(兼容; ICS)”,apache吞噬了所有可用内存。

因此,我想阻止此用户代理伴随的所有请求,因此我尝试在httpd.conf中执行此操作:

SetEnvIfNoCase User-Agent "Mozilla/4.0 (compatible; ICS)" bad_user
Deny from env=bad_user

但是当我重新启动apache时,它抱怨在deny这里使用。不必将其包装在locationdirectory块中,这意味着我必须为每个站点添加一个新块,有什么办法可以拒绝访问整个服务器?


更新:我得到的错误


  • 在/etc/apache2/httpd.conf的第4行上重新启动Web服务器apache2 语法错误:此处不允许拒绝[失败]

Answers:


7

现在看起来像是一个老问题,但我想做同样的事情,并从上面找到了答案。它不是完全正确-在我看来应该是<Location "/">,并且SetEnvIf需要一个正则表达式,因此需要在括号中加上引号。

这对我来说可以在所有虚拟主机上应用访问控制:

SetEnvIfNoCase User-Agent "^Mozilla/4.0 \(compatible; Synapse\)" bad_ua
<Location "/">
    Deny from env=bad_ua
</Location>

只需在vhost定义之前包括它即可。


(对于Apache 2.4中的等效项)请小心使用,<Location>因为它会覆盖中的任何其他授权限制<Directory>,除非您添加AuthMerging And。请参阅Requireapache文档中有关的安全警告:httpd.apache.org/docs/2.4/mod/mod_authz_core.html#require
Cedric Knight

4

可以根据文档在服务器级别配置mod_rewrite:

RewriteCond %{HTTP_USER_AGENT} "Mozilla/4\.0 \(compatible; ICS\)" [nocase]
RewriteRule ^.*$ - [forbidden,last]

别忘了逃脱正则表达式 RewriteCond


1
注意:复制时,破折号不是真正的破折号。我尝试编辑,但是SF会抱怨我的编辑太小。无论如何,谢谢,请客!
ThibautBarrère2014年

@ThibautBarrère如果确实需要,可以通过在编辑内容中添加不可见的内容<!-- -->来绕过小的编辑限制
hanshenrik

1

如果SetEnv行上的语法正确,那么您应该可以将其像这样放置在conf中:

<Location *>
SetEnvIfNoCase User-Agent "Mozilla/4.0 (compatible; ICS)" bad_user
Deny from env=bad_user
</Location>

应该允许它在所有虚拟主机上运行-刚刚在2.2.24上进行了测试,就像一个魅力。


这样做的好处是没有任何错误,但是在欺骗我的用户代理时,我不会被拒绝。知道为什么会这样吗?
汤姆·赖特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.