如何在 Apache 中阻止特定的用户代理

Posted

技术标签:

【中文标题】如何在 Apache 中阻止特定的用户代理【英文标题】:How to block a specific user agent in Apache 【发布时间】:2019-01-29 01:24:31 【问题描述】:

我正在配置我的 Django 应用程序以通过电子邮件向我发送错误(异常)。

通常没问题 - 但我的电子邮件托管在 Office 365 上,而且似乎 Microsoft 会自动扫描和加载电子邮件中的 URL。

结果是它访问了我的 Django 应用程序中的 URL,并导致另一个错误……和另一封电子邮件。最终结果:一个迷人的小邮件循环,它在几秒钟内向我发送了 50 多条消息。

我在我的 apache 日志中发现了这样的条目:

157.55.39.163 - - [22/Aug/2018:17:30:05 +0000] "GET /testerror HTTP/1.1" 500 5808 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534+ (Khtml, like Gecko) BingPreview/1.0b"

我想阻止对用户代理的访问(包含“BingPreview”),所以我可以防止这个循环。

我把它放到我的虚拟主机中:

SetEnvIf User-Agent "^.*BingPreview.*$" bad_user

<Directory /path/top/my/app/>
   <Files wsgi.py>
       Require not env bad_user
   </Files>
</Directory>

但是当我重新加载 apache 时,我收到错误 negative Require directive has no effect in &lt;RequireAny&gt; directive

【问题讨论】:

我会像这样使用mod_rewrite:***.com/a/4628075/7362396 - 然后 RewriteCond 使用典型的RewriteRule . - [R=403,L] 来阻止它。 您可能会发现这很有帮助 - serverfault.com/questions/499327/…。我认为您需要使用&lt;Location&gt; 指令而不是&lt;Directory&gt; 感谢@TobiasK,我采用了您的想法并在下面发布了解决方案。 谨慎使用&lt;Location&gt;,因为它会覆盖&lt;Directory&gt; 中的任何其他授权限制,除非您添加AuthMerging And。请参阅 apache 文档中有关 Require 的安全警告:httpd.apache.org/docs/2.4/mod/mod_authz_core.html#require 【参考方案1】:

想通了。感谢@Tobias K 的提示。

我启用了 mod_rewrite,因为它尚未启用。

a2enmod rewrite

然后我把它放到我的虚拟主机中:

RewriteEngine on
RewriteCond %HTTP_USER_AGENT  ^.*BingPreview.*$
RewriteRule . - [R=403,L]

并重启apache生效:

service apache2 restart

我可以在 apache 日志中看到 BingPreview 被阻止(注意 403):

157.55.39.163 - - [22/Aug/2018:18:12:09 +0000] "GET /testerror HTTP/1.1" 403 4385 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534+ (KHTML, like Gecko) BingPreview/1.0b"

【讨论】:

这破坏了主网站(wordpress)的重写。所有链接都显示 404。 @e-info128 对于所有用户代理?上面的 mod_rewrite 指令本身不能做到这一点。 (?) @e-info128 然后修复你的 WordPress 的.htaccess【参考方案2】:

但是当我重新加载 apache 时,我收到错误 negative Require directive has no effect in &lt;RequireAny&gt; directive

如果没有明确说明,&lt;RequireAny&gt; 是默认的“隐含”容器。

您可以通过执行以下操作来解决此问题:

SetEnvIf User-Agent "BingPreview" bad_user

<Directory /path/top/my/app/>
   <Files wsgi.py>
       <RequireAll>
       Require all granted
       Require not env bad_user
       </RequireAll>
   </Files>
</Directory>

“正则表达式”BingReview^.*BingPreview.*$ 相同。

【讨论】:

以上是关于如何在 Apache 中阻止特定的用户代理的主要内容,如果未能解决你的问题,请参考以下文章

Amazon S3 存储桶策略阻止用户代理

如何防止用户代理被用户更改

转载如何阻止网站被恶意反向代理访问(几种级别的解决方案)

如何使用 Apache 在代理设置中重写位置响应标头?

PHP 阻止您网站的代理用户

阻止来自用户代理的所有请求