获取报价

529501683@qq.com 微信扣扣同号

联系我帮您解决你的网站安全问题,请点击最左侧获取报价!!!

WordPress安全策略:使用htaccess保护你的网站(上)

.htaccess介绍

关于.htaccess其实就是一个文本文件,里面存放着跟Apache相关的服务器配置指令信息,其类似于Apache的httpd.conf,不同的是一个跟网站整体使用相关,另一个则是跟安全规则相关。

Apache分为1.x和2.x,其中Apache 2.x 是 Apache 1.x 的升级版本,提供了更好的模块化、性能、扩展性和安全性。目前情况都是建议选择最新的 Apache 2.x 版本,因为它提供了更多的功能和改进。

所以有时候在使用Debian或者Ubuntu等操作系统时候,发现搭建完成Apache服务,配置Apache发现配置文件路径有个Apache2之类的字样。

上面说了.htaccess和httpd.conf是有区别的,其中有个很大区别是.htaccess只作用于当前目录下。

而且只有当用户访问含有.htaccess所在的目录期间才会加载.htaccess文件,这也有一个弊端,就是对服务器的开销要大点,速度可能会有所影响。

如果很在意这个可以考虑可兼容使用.htaccess的所有规则参数的OpenLiteSpeed。

而httpd.conf配置文件则是在Apache服务启动的时候就已经加载,这么做的目的是可以提高 Apache 服务器的性能、资源管理、稳定性、管理便利性和安全性。

这是 Apache 服务器设计中的一个重要策略,旨在确保服务器在启动后能够高效、稳定和安全地运行。

.htaccess启用与生效。

正常情况下,在搭建好Apache服务之后,.htaccess是默认是不启用的,所以需要去配置文件httpd.conf中查看是否有如下一行配置参数,如果没有就将其更改为如下的配置参数:

<Directory "/var/www/html/public_html">
    AllowOverride All
</Directory>

Tips: 需要注意的是,如果你是自己购买的VPS,然后Apache是自己搭建的,那么你必须要按照上述操作检查确认.

但是如果你所购买的是虚拟主机,并且服务提供商明确指出了具备此功能,那么上述步骤可省略,到目前为止我发现很多服务提供商都自带这些功能,而且使用的是商业版的LiteSpeed,这种情况就无需考虑去验证。

除了上述验证的方式,还有一种验证是否启用.htaccess的方法就是写一个拒绝所有的指令,然后尝试去访问网站。

如果显示403被拦截,那么说明启用了.htaccess,或者直接随便写个错误的指令,让服务器无法识别,这样就会导致访问网站显示500错误,如果出现这种情况,那说明也是启用了.htaccess指令。

AllowOverride指令诠释

AllowOverride All 是 Apache HTTP Server 配置文件中的一条指令,主要用于控制 .htaccess 文件中的指令是否可以覆盖主配置文件中的设置。

具体来说,这个指令决定了是否允许在 .htaccess 文件中使用 AllowOverride 指令来覆盖主配置文件中的访问控制设置。

  • AllowOverride All:允许 .htaccess 文件中的所有指令覆盖主配置文件中的相应设置。
  • AllowOverride None:不允许 .htaccess 文件中的任何指令覆盖主配置文件中的设置。
  • AllowOverride 的其他选项:还可以指定特定的指令类别,例如 AuthConfig、FileInfo、Indexes 等,允许 .htaccess 文件中仅覆盖这些类别的指令。

默认与index.php相关的.htaccess指令

  • 一般情况下使用VPS或者虚拟主机服务商提供的业务,安装了WordPress的环境中都会看到关于index.php的配置,这个配置一般写在.htaccess文件中。
  • 默认情况下.htaccess文件默认的配置如下:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
  • 关于上述配置参数的解释如下: 使用mod_rewrite模块来实现URL重写的示例,通常用于PHP框架(如WordPress、Laravel等)中,以便将所有请求路由到单一的入口文件(如index.php)。下面是对每一行配置的详细解释:
<IfModule mod_rewrite.c>
这行代码检查mod_rewrite模块是否已加载。如果模块未加载,则不会执行其内部的任何指令。

RewriteEngine On
这行代码启用重写引擎。如果没有这行代码,所有重写规则都不会生效。

RewriteBase /
这行代码设置重写操作的基本URL路径。在这里,它被设置为根目录(/),这意味着重写规则将应用于整个网站。

RewriteRule ^index\.php$ - [L]
这行代码匹配任何对index.php的直接请求,并停止进一步处理(由于[L]标志)。这通常用于防止对index.php的请求被进一步重写。

RewriteCond %{REQUEST_FILENAME} !-f
这行代码是一个条件,检查请求的文件是否不存在。如果文件存在,则不会应用后续的重写规则。

RewriteCond %{REQUEST_FILENAME} !-d
这行代码也是一个条件,检查请求的目录是否不存在。如果目录存在,则不会应用后续的重写规则。

RewriteRule . /index.php [L]
这行代码是实际的重写规则。它匹配任何请求(由于.),并将这些请求重写到/index.php。[L]标志表示这是最后一条规则,如果匹配,则停止进一步处理。

总结
这个配置的目的是将所有非文件和非目录的请求(即动态请求)重写到index.php,从而允许PHP框架处理这些请求。这对于实现漂亮的URL和单一入口点架构非常有用。

使用.htaccess进行访问控制

使用.htaccess进行访问控制会用到Order,Allow和Deny这些关键字。

访问控制基础Order命令介绍

关于Order这个命令有时候确实容易弄混淆,我记得我在刚学习这个指令的时候就弄混淆过,所以要想真正搞清楚,那就是实战测试验证,然后总结出来。

Order 指令在 Apache HTTP Server 中用于控制 Allow 和 Deny 指令的执行顺序,从而决定如何处理访问请求。Order 指令有两种常见的设置:Order allow,deny 和 Order deny,allow。

Order allow,deny黑名单测试验证

这里以下面规则指令进行验证,具体如下:

Order allow,deny黑名单测试验证
<Files xmlrpc.php>
    Order allow,deny
    Deny from 10.10.9.232
    Allow from all
</Files>

上面的规则我先尝试猜测她的逻辑,假如我猜测她的逻辑指令执行顺序是这样的:

指令执行顺序: Order allow,deny 意思是先允许后拒绝。 Deny from 10.10.9.232 拒绝IP地址为10.10.9.232来访问xmlrpc.php这个文件。 Allow from all 除了上面拒绝的IP地址其他IP过来访问都允许。

好了,看到上面的猜测了,我们来验证一下。

当前访问IP为10.10.9.232

WordPress安全策略:使用htaccess保护你的网站

访问http://uwptest.lan/xmlrpc.php 看结果是不是被拦截了

WordPress安全策略:使用htaccess保护你的网站

确实被拦截了,我们看看访问日志

WordPress安全策略:使用htaccess保护你的网站

由此可以确认上面规则指令拒绝IP地址10.10.9.232是没有问题的,那么接下来我们看看其他IP地址是否都能正常访问。

WordPress安全策略:使用htaccess保护你的网站
WordPress安全策略:使用htaccess保护你的网站

发现访问结果是被允许的,说明上述提到的规则指令跟预期假设一致。


如果上述规则指令我变动一下顺序会有影响吗?

WordPress安全策略:使用htaccess保护你的网站
<Files xmlrpc.php>
    Order allow,deny
    Allow from all
    Deny from 10.10.9.232
</Files>

就是更换了Allow from all和Deny from 10.10.9.232的顺序我们看看下面测试验证的结果。

WordPress安全策略:使用htaccess保护你的网站

发现符合预期假设的结果,所以得出结论是: 规则指令Allow from all和Deny from 10.10.9.232之间互换顺序是没有影响的。

得出的结论:

  1. 在Order allow,deny不变的位置顺序的情况下,指令执行顺序是先允许,后拒绝,所以在此逻辑之下,得出的结论是默认允许所有IP地址访问,除非明确指出了不能访问的IP地址。
  2. 再升华一点理解,在上述基础之上就是设置了一个黑名单,意思就是不能访问的IP地址都写在上面的指令里面,那么其他没有写的都能访问。

Order allow,deny拒绝所有测试验证

测试验证的场景跟上面一样,这次测试验证不同的是,在保持Order allow,deny不变的情况下,将Allow from all更为Deny from all;将Deny from 10.10.9.232更改为Allow from 10.10.9.232;

WordPress安全策略:使用htaccess保护你的网站
<Files xmlrpc.php>
    Order allow,deny
    Allow from 10.10.9.232
    Deny from all
</Files>

我们再次来猜测一下规则指令执行的结果:

Order allow,deny 先允许后拒绝 Allow from 10.10.9.232 仅允许IP地址为10.10.9.232来访问xmlrpc.php Deny from all 拒绝所有IP地址来访问xmlrpc.php

使用IP地址10.10.9.232访问xmlrpc.php测试验证:

WordPress安全策略:使用htaccess保护你的网站
WordPress安全策略:使用htaccess保护你的网站

大家看到没,结果不是上面猜测的预期结果,预期结果是允许IP地址10.10.9.232能够访问xmlrpc.php,但实际测试验证结果是该IP地址依然被拦截了,在这个逻辑之下的结论我们等会再说,先看看非10.10.9.232的IP地址访问结果是咋样的。

WordPress安全策略:使用htaccess保护你的网站
WordPress安全策略:使用htaccess保护你的网站

大家看清楚了吗?上面测试验证的规则指令是拒绝所有,指令 Allow from 10.10.9.232 根本没生效,这就是大坑,那么这种情况该如何理解呢?最终的结论暂时待定,等我演示完后面的Order deny,allow之后再给大家总结最终结论。


Order deny,allow允许所有测试验证

继续测试验证我们的场景,场景环境依然跟上面一样,不同的是这次,我只更改了Order的执行顺序,把上面的黑名单测试验证指令的Order allow,deny更改为Order deny,allow;其他保持不变。

WordPress安全策略:使用htaccess保护你的网站
<Files xmlrpc.php>
    Order deny,allow
    Deny from 10.10.9.232
    Allow from all
</Files>

在测试验证之前我们同样猜测下指令结果:

Order deny,allow 先执行拒绝,再执行允许 Deny from 10.10.9.232 仅拒绝IP地址10.10.9.232访问xmlrpc.php Allow from all  允许所有IP地址访问xmlrpc.php

使用IP地址为10.10.9.232访问xmlrpc.php的测试验证结果:

WordPress安全策略:使用htaccess保护你的网站
WordPress安全策略:使用htaccess保护你的网站

发现10.10.9.232这个IP地址并非预期猜测的结果,测试验证的结果是IP地址10.10.9.232能够正常访问xmlrpc.php,先放着我们继续测试。

WordPress安全策略:使用htaccess保护你的网站
WordPress安全策略:使用htaccess保护你的网站

看到没,可以正常访问,这条指令允许所有IP地址访问xmlrpc.php,命中指令Allow from all


Order deny,allow白名单测试验证

继续测试验证,保持Order deny,allow不变,这次更改的是将原有的Deny from 10.10.9.232更改为Allow from 10.10.9.232;原来的Allow from all更改为Deny from all

WordPress安全策略:使用htaccess保护你的网站
<Files xmlrpc.php>
    Order deny,allow
    Allow from 10.10.9.232
    Deny from all
</Files>

在测试验证之前我们同样猜测下指令结果:

Order deny,allow 先执行拒绝,再执行允许 Allow from 10.10.9.232 仅允许IP地址10.10.9.232访问xmlrpc.php Deny from all  拒绝所有IP地址访问xmlrpc.php

使用IP地址为10.10.9.232访问xmlrpc.php的测试验证结果:

WordPress安全策略:使用htaccess保护你的网站
WordPress安全策略:使用htaccess保护你的网站

发现10.10.9.232这个IP地址达到预期猜测的结果,测试验证的结果是IP地址10.10.9.232能够正常访问xmlrpc.php,先放着我们继续测试。

WordPress安全策略:使用htaccess保护你的网站
WordPress安全策略:使用htaccess保护你的网站

依然达到预期的猜测结果,非10.10.9.232的IP地址访问xmlrpc.php被拒绝。


指令Order最终结论总结

经过上面的各方面测试验证,得出了如下结论:

  1. 黑名单形式指令,按照如下格式固定不变,添加要拒绝的IP地址即可,具体如下:
<Files xmlrpc.php>
    Order allow,deny
    Deny from 10.10.9.232
    Allow from all
</Files>
  1. 白名单形式指令,按照如下格式固定不变,添加要允许的IP地址即可,具体如下:
<Files xmlrpc.php>
    Order deny,allow
    Allow from 10.10.9.232
    Deny from all
</Files>
  1. 拒绝所有IP地址访问,参考如下固定格式,具体如下:
<Files xmlrpc.php>
    Order allow,deny
    Allow from 10.10.9.232
    Deny from all
</Files>
  1. 允许所有IP地址访问,参考如下固定格式,具体如下:
<Files xmlrpc.php>
    Order deny,allow
    Deny from 10.10.9.232
    Allow from all
</Files>

最终结论如下:

Order allow,deny和Order deny,allow的指令执行顺序判断方式是:从右向左看,从右向左看,从右向左看,重要论点说三遍;

黑名单:Order allow,deny 从右向左看,那么deny优先执行,当看到Deny from 10.10.9.232,那么指令会执行拒绝IP地址10.10.9.232的访问,其他指令命中Allow from all则方行。

白名单:Order deny,allow 从右向左看,那么allow优先执行,当看到Allow from 10.10.9.232,那么指令会执行仅允许IP地址10.10.9.232的访问,其他指令命中Deny from all则拒绝。

拒绝所有:Order allow,deny 从右向左看,那么deny优先执行,当看到Deny from all,那么指令会执行拒绝所有的IP地址访问,因为是拒绝优先,所以其他指令根本不看直接忽略,不会命中Allow from 10.10.9.232。

允许所有:Order deny,allow 从右向左看,那么allow优先执行,当看到Allow from all,那么指令会执行允许所有的IP地址访问,因为是允许优先,所以其他指令根本不看直接忽略,不会命中Deny from 10.10.9.232。

Photo of author

Fenotion Woo

从专业的角度,为你提供最优的安全解决方案,我的安全解决方案充分充分考虑服务器网站的性能问题,做到以最小的操作方式解决安全问题。

Leave a comment