【问题标题】:How can I disable mod_security in .htaccess file?如何在 .htaccess 文件中禁用 mod_security?
【发布时间】: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 UserUnix & Linux Stack Exchange 会是一个更好的提问地方。另见Where do I post questions about Dev Ops?
  • 首先,这不是一个编程问题(虽然我认为它是,这就是我碰到这个页面的方式)。其次,这是一个旧线程。无论如何,我希望每个人都能从中有所收获。我也遇到了 Mod_Security 错误,但我的主机 (bluehost) 为我将页面列入白名单。我不必自己关闭模组。

标签: php apache .htaccess


【解决方案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>

【讨论】:

【解决方案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 注入的大门。因此,您需要确保您有自己的安全措施或尽快重新启用安全性。

      【讨论】:

        猜你喜欢
        • 2016-11-23
        • 1970-01-01
        • 1970-01-01
        • 2021-06-23
        • 1970-01-01
        • 2010-12-19
        • 2014-07-07
        • 2020-11-05
        • 1970-01-01
        相关资源
        最近更新 更多