如何在 .htaccess 文件中禁用 mod_security?

Posted

技术标签:

【中文标题】如何在 .htaccess 文件中禁用 mod_security?【英文标题】:How can I disable mod_security in .htaccess file? 【发布时间】:2012-10-07 08:37:24 【问题描述】:

我们如何在 Apache 服务器上使用 .htaccess 文件禁用 mod_security

我在我的个人域上使用 WordPress,并发布了一篇内容有一些代码块的帖子,根据我的托管服务提供商所说,mod_security 给出了一个错误,并且我的 IP 由于mod_security 而进入了防火墙。

所以我想通过使用.htaccess 文件来禁用mod_security

【问题讨论】:

Stack Overflow 是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Super User 或Unix & Linux Stack Exchange 会是一个更好的提问地方。另见Where do I post questions about Dev Ops? 首先,这不是一个编程问题(虽然我认为它是,这就是我碰到这个页面的方式)。其次,这是一个旧线程。无论如何,我希望每个人都能从中有所收获。我也遇到了 Mod_Security 错误,但我的主机 (bluehost) 为我将页面列入白名单。我不必自己关闭模组。 【参考方案1】:

可以这样做,但很可能您的主机实现了mod_security 是有原因的。确保他们同意您为自己的网站禁用它。

也就是说,应该这样做;

<IfModule mod_security.c>
  SecFilterEngine Off
  SecFilterScanPOST Off
</IfModule>

【讨论】:

请注意,可以编译 mod_security 以防止 .htaccess 文件关闭此功能。并且主机可以通过 AllowOverride 设置来限制 .htaccess 授权。 非常正确。我想这里最好的方法是联系托管服务提供商并请求将块(节?)合并到虚拟主机中。这样,您也将清楚主机可能在您首先关闭 mod_security 时遇到的任何问题。 :) 是否可以仅对某些 URL/文件禁用它? 如果你把它放在一个特定的 块中,或者放在一个 .htaccess 文件中,当然可以。查看 Apache 中文件匹配的工作原理。【参考方案2】:

一些服务器和网络主机上,可以通过.htaccess 禁用 ModSecurity,但请注意,您只能打开或关闭它,不能禁用个别规则。

但仍可确保您的网站安全的一个好做法是仅在特定 URL 上禁用它,而不是在整个网站上禁用它。您可以通过下面 &lt;If&gt; 语句中的正则表达式指定要匹配的 URL...

### DISABLE mod_security firewall
### Some rules are currently too strict and are blocking legitimate users
### We only disable it for URLs that contain the regex below
### The regex below should be placed between "m#" and "#" 
### (this syntax is required when the string contains forward slashes)
<IfModule mod_security.c>
  <If "%REQUEST_URI =~ m#/admin/#">
    SecFilterEngine Off
    SecFilterScanPOST Off
  </If>
</IfModule>

【讨论】:

在我看来,这是最好的解决方案。我在使用 GravityForms 时遇到问题,对于我添加的网址 wp-admin/admin.php?page=gf_edit_forms 我无法完成这项工作,并在 Server Fault 找到了另一种方法:How to disable mod_security2 rule (false positive) for one domain on centos 5【参考方案3】:

只是为 mod_security 2.7.0+ 更新此问题 - 他们关闭了通过 htaccess 缓解 modsec 的功能,除非您使用 --enable-htaccess-config 标志编译它。大多数主机不使用此编译器选项,因为它允许过于宽松的安全性。相反,httpd.conf 中的虚拟主机是您控制 modsec 的首选选项。

即使您使用 htaccess 缓解编译 modsec,可用的指令也较少。例如,SecRuleEngine 不能再在那里使用。如果允许,以下是默认情况下可在 htaccess 中使用的列表(请记住,主机可能会进一步使用 AllowOverride 限制此列表):

    - SecAction
    - SecRule

    - SecRuleRemoveByMsg
    - SecRuleRemoveByTag
    - SecRuleRemoveById

    - SecRuleUpdateActionById
    - SecRuleUpdateTargetById
    - SecRuleUpdateTargetByTag
    - SecRuleUpdateTargetByMsg

More info on the official modsec wiki

作为 2.x 用户的附加说明:IfModule 现在应该寻找 mod_security2.c 而不是旧的 mod_security.c

【讨论】:

【参考方案4】:

对于包括 NameCheap 在内的某些网络主机,无法使用 .htaccess 禁用 ModSecurity。唯一的选择是联系技术支持并要求他们为您更改配置。

【讨论】:

这听起来应该是关于其中一个答案的“评论”,而不是答案本身。 Simon East,不幸的是,我的答案是“namecheap”托管的唯一选项。不是评论。您别无选择,只能请求技术支持为您启用此选项。这是事实,不是意见,不是评论。我用便宜的名字。另请注意,我目前没有 50 或更高的声誉,因此无法将我的答案添加为评论。 好的,我知道它不会让你发表评论。我想在答案中说“这对你没有帮助”听起来很混乱,因为我们不确定“这个”指的是什么——你指的是原始问题还是其他用户的答案?也许您的意思是 .htaccess 对 NameCheap 没有任何帮助,对吗? 我所说的“这个”是指所有的答案、所有的代码、所有的尝试,所有这些……都行不通。直到联系支持并且 OP 请求(和接收)启用对任何类型的 mod_security 功能的访问之后。 OP 正在询问如何做一些如果它们托管在 namecheap 上则无法完成的事情。因此,我的回答是一个有效的答案,通知 OP 和其他任何在谷歌上搜索此问题的人,namecheap 托管本身将要求他们请求许可才能执行此操作。我希望在他们的代码被阻止时节省人们的时间和挫败感。 合法答案。通常我不喜欢“你不能”的答案,因为它通常意味着“我不知道”。但在这种情况下,“你不能”是正确的。 (到目前为止,我也在 namecheap 上——很棒的主人)。【参考方案5】:

当上述解决方案不起作用时,试试这个:

<IfModule mod_security.c>
  SecRuleEngine Off
  SecFilterInheritance Off
  SecFilterEngine Off
  SecFilterScanPOST Off
  SecRuleRemoveById 300015 3000016 3000017
</IfModule>

【讨论】:

为什么你的答案比其他答案好?我只能看到SecRuleEngine OffSecFilterInheritance Off 中的值,但您没有解释SecRuleRemoveById 的工作原理吗?我理解这个概念:可以通过该指令有选择地关闭您列出的数字等个别规则。但是你为什么在你的帖子中专门使用30001530000163000017 是的,这些数字代表什么? 仍然对这些数字的含义感到好奇...? 数字是特定的 ModSec 规则。似乎更安全的是逐个禁用规则,而不是关闭整个事情。然而,这个答案也会关闭整个事情,在这种情况下关闭某些规则是没有意义的。【参考方案6】:

在站点根目录的 .htaccess 文件中编辑以下行:

<ifmodule mod_security.c>

SecFilterEngine Off
SecFilterScanPOST Off

</ifmodule>

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule . /index.php [L]
</IfModule>

只需将 SecFilterEngine 之类的 mod_security 规则和部件彼此分开即可。它适用于 apache 服务器

【讨论】:

【参考方案7】:

对于任何只想绕过错误页面以在共享主机上显示内容的人。您可能想尝试在 .htaccess 文件中使用重定向。如果是说 406 错误,在 UnoEuro 上它似乎并不能简单地停用安全性。所以我改用这个:

ErrorDocument 406 /

然后您可以随时使用 PHP 更改错误状态。但请注意,在我的情况下,这样做意味着我在绕过 WAF 时打开了 SQL 注入的大门。因此,您需要确保您有自己的安全措施或尽快重新启用安全性。

【讨论】:

以上是关于如何在 .htaccess 文件中禁用 mod_security?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 .htaccess 文件中的某些媒体文件禁用 Apache gzip 压缩?

如何在 .Htaccess 中禁用/不允许共享主机 RewriteLog 时,在 Apache 2 中模拟和测试 URL 重写规则?

访问另一个网站的 htaccess

使用 .htaccess 在目录(包括所有子目录)中禁用 PHP

通过 .htaccess 禁用服务器令牌会破坏网站

禁用 httpd.conf 中的目录浏览与 apache 上的 .htaccess