如何在 .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
禁用 ModSecurity,但请注意,您只能打开或关闭它,不能禁用个别规则。
但仍可确保您的网站安全的一个好做法是仅在特定 URL 上禁用它,而不是在整个网站上禁用它。您可以通过下面 <If>
语句中的正则表达式指定要匹配的 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 Off
和SecFilterInheritance Off
中的值,但您没有解释SecRuleRemoveById
的工作原理吗?我理解这个概念:可以通过该指令有选择地关闭您列出的数字等个别规则。但是你为什么在你的帖子中专门使用300015
、3000016
和3000017
?
是的,这些数字代表什么?
仍然对这些数字的含义感到好奇...?
数字是特定的 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 重写规则?