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

47
我们如何在Apache服务器上使用.htaccess文件禁用mod_security?
我正在个人领域上使用WordPress,并发布一篇帖子,其中包含一些代码块。根据我的主机供应商说,mod_security会导致错误,并且由于mod_security,我的IP已被防火墙拦截。因此,我想通过使用.htaccess文件禁用mod_security。

Stack Overflow是一个关于编程和开发问题的网站。这个问题似乎不属于编程或开发范畴。请参阅帮助中心中的我可以在这里问什么样的问题。也许超级用户Unix&Linux Stack Exchange更适合提问。另请参阅我应该在哪里发布Dev Ops相关问题? - jww
首先,这不是一个编程问题(尽管我以为是,这就是我如何进入这个页面的原因)。其次,这是一个旧的线程。无论如何,我希望每个人都能从中获得一些收获。我也遇到了Mod_Security错误,但我的主机(bluehost)为我白名单了该页面。我不需要自己关闭mod。 - itsols
7个回答

58

这是可能的,但很可能您的主机为某种原因实现了mod_security。确保他们同意您禁用它以供您自己的站点使用。

话虽如此,以下代码可以实现:

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

12
请注意,mod_security可以编译,以防止通过.htaccess文件关闭它。而主机也可以通过AllowOverride设置限制.htaccess授权。 - regilero
非常正确。我想在这里最好的方法是联系托管提供商,并请求将该块(段落?)合并到vhost中。这样,您还可以避免主机可能对您首先关闭mod_security的任何问题感到困扰。 :) - Xyon
是否有可能只针对某些特定的URL/文件禁用它? - Simon East
如果您将它放置在特定的<Directory>块中或者放在一个.htaccess文件中,是可以的。请查阅Apache中文件匹配的工作原理。 - Xyon

15

在一些服务器和网络主机上,可以通过 .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>

2
这是我认为最好的解决方案。我在使用GravityForms时遇到了问题,对于URL,我添加了wp-admin/admin.php?page=gf_edit_forms - Ciprian Tepes
我无法使其工作,并在Server Fault上找到了另一种方法:如何在CentOS 5上为一个域禁用mod_security2规则(误报) - brasofilo

6
当上述解决方案无法解决问题时,请尝试以下方法:
<IfModule mod_security.c>
  SecRuleEngine Off
  SecFilterInheritance Off
  SecFilterEngine Off
  SecFilterScanPOST Off
  SecRuleRemoveById 300015 3000016 3000017
</IfModule>

4
你的答案为什么比其他答案更好?我只看到了SecRuleEngine OffSecFilterInheritance Off的价值,但是你没有解释SecRuleRemoveById如何工作。我了解这个概念:像你列出的数字一样的单独规则可以通过该指令选择性地关闭。但是为什么你在帖子中特别使用了30001530000163000017?为什么您的答案比其他答案更好?我只看到了SecRuleEngine OffSecFilterInheritance Off的价值,但是您并没有解释SecRuleRemoveById的工作原理。我了解其概念:通过该指令,像您列出的数字那样的单独规则可以被选择性地关闭。但是,为什么您在文章中特别使用30001530000163000017 - Giacomo1968
3
好的,这些数字代表什么? - Simon East
2
还对这些数字的含义感到好奇吗...? - nullwriter
这些数字是特定的ModSec规则。逐个禁用规则似乎更安全,而不是关闭整个系统。然而,这个答案也关闭了整个系统,在这种情况下,关闭某些规则就没有意义了。 - johny why
只使用 SecRuleRemoveById 300015 这一行对我有效。 - Eternal

5
仅针对mod_security 2.7.0+更新此问题-他们关闭了通过htaccess减轻modsec的能力,除非您使用--enable-htaccess-config标志进行编译。大多数主机不使用此编译器选项,因为它允许过于宽松的安全性。相反,在httpd.conf中的虚拟主机是控制modsec的首选选项。
即使您使用htaccess缓解编译模块,也会有较少的指令可用。例如,SecRuleEngine不能再在此处使用。以下是默认情况下可以在htaccess中使用的列表(请记住,主机可能会进一步限制此列表,使用AllowOverride):
    - SecAction
    - SecRule

    - SecRuleRemoveByMsg
    - SecRuleRemoveByTag
    - SecRuleRemoveById

    - SecRuleUpdateActionById
    - SecRuleUpdateTargetById
    - SecRuleUpdateTargetByTag
    - SecRuleUpdateTargetByMsg

更多有关官方modsec wiki的信息

对于2.x用户的额外说明:现在IfModule应该寻找mod_security2.c而不是旧版本的mod_security.c


5

有些网站主机(包括NameCheap)不支持使用.htaccess来禁用 ModSecurity。唯一的解决方案是联系技术支持,并要求他们为您更改配置。


1
这似乎应该是关于其中一个答案的“评论”,而不是一个答案。 - Simon East
3
西蒙·伊斯特,很不幸,“Namecheap”托管的选项只有我的回答是唯一的选择。这不是评论,而是事实。你别无选择,只能向技术支持人员询问如何启用此选项。我自己也使用“Namecheap”。另外请注意,我当前声望值不足50,因此无法将我的回答添加为评论。 - Alex
好的,我看到它不允许你评论。我想说“这不会帮助你”听起来很困惑,因为我们不确定“这”指的是什么——你是指原始问题还是另一个用户的答案?也许你的意思是在NameCheap上.htaccess将没有任何帮助,是吗? - Simon East
2
“this”指的是所有答案、所有代码、所有尝试,无论如何都不会起作用。除非在联系支持并且OP请求(并获得)启用任何类型的mod_security功能之后。如果他们的主机是在Namecheap上托管,那么OP正在询问一些无法完成的事情。因此,我的回答是一个有效的答案,告知OP和任何通过谷歌搜索此问题的人,Namecheap托管本身将要求他们请求权限来完成此操作。我希望能够节省人们的时间和挫折感,让他们认为自己的代码没有起作用,而实际上是被阻止了。 - Alex
合法答案。通常我不喜欢“你不能”的回答,因为它通常意味着“我不知道”。但在这种情况下,“你不能”是正确的。(我也在Namecheap--到目前为止是一个很好的主机)。 - johny why

4
在站点根目录的 .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>

只需将 mod_security 规则如 SecFilterEngine 和其他部分分开即可。这适用于 Apache 服务器。


0

对于那些只是想绕过错误页面,在共享主机上显示内容的人,您可以尝试在 .htaccess 文件中使用重定向。如果出现 406 错误,在 UnoEuro 上似乎不能简单地停用安全性来解决。所以我使用了这个方法:

ErrorDocument 406 /

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接