htaccess 命令拒绝,允许规则

htaccess 命令拒绝,允许规则

我想通过 htaccess 动态地将 IP 添加到阻止列表。我希望有人能告诉我以下方法是否适用于我的情况(我不确定如何通过 localhost 进行测试)。

我的 .htaccess 文件默认包含以下内容:

order allow,deny
allow from all

IP 将动态附加:

Order Deny,Allow
Allow from all
Deny from 192.168.30.1

我的理解是,默认情况下,它允许所有规则,并带有可选的拒绝规则列表。如果我没记错的话,Order Deny,Allow我会先查看拒绝列表,这样对吗?

“允许所有”规则是否需要放在最后?

编辑1

如果我没记错的话我需要根据 jeffatrackaid 的回答来做这件事:

Order Allow,Deny
Allow from all
Deny from 192.168.30.1

编辑2

为了完整起见,这可能更适合我的要求:

Order Deny,Allow
Deny from 192.168.30.1

答案1

此规则允许所有人进入您的网站。

Order Deny,Allow
Allow from all
Deny from 192.168.30.1

Order指令决定了规则的处理顺序。Order deny,allow首先处理拒绝列表,然后处理允许列表。

使用 Apache 时,所有规则都会被处理,其中最后一个匹配的规则将成为有效规则。

因此在这种情况下,您的最后一条规则是allow from all

这意味着192.168.30.1最初会被拒绝,但随后会被允许,因为允许规则是最后处理的。

这将产生相同的结果

Order Deny,Allow
Allow from all
Deny from 192.168.30.1
Allow from 192.168.30.1

这样想想。

  • 允许/拒绝规则只是允许/拒绝的 IP 的单独列表。
  • order指令决定处理这些列表的顺序。
  • Apache 评估所有规则并根据最后匹配规则的结果采取行动。

主要的混淆是,这与防火墙的工作方式非常不同,在防火墙的工作方式中,规则顺序和首次匹配通常决定访问权限。

看:http://httpd.apache.org/docs/2.2/mod/mod_authz_host.html#order

答案2

在配置文件(例如 .conf)中,如果您有:

Order Deny,Allow 
Allow from all 
Deny from 192.168.30.1 

用户只想阻止对一个 IP(192.168.30.1)的访问,但允许对其余 IP 的访问。

现实:Apache 授予所有 IP 地址的访问权限,这暴露了严重的安全威胁,并且完全违背了用户的意图。


根本原因:该条目Order起着关键作用:它决定了函数拒绝和允许的执行顺序。如果将 的值Order设置为deny,allow,则任何与条目中指定的值匹配的 IP 地址Deny from都会获得临时返回值拒绝。之后,它会检查条目Allow from,如果匹配,则会收到返回值允许,该值将覆盖先前的值。查看 Apache 中的源代码片段(见下文),您可以发现为什么 192.168.30.1 未被 Apache 阻止。

int ret = OK; // default

if (a->order[method]==ALLOW_THEN_DENY) { 
    ret = HTTP_FORBIDDEN;
  
    if (find_allowdeny(r,a-> allows,method)) 
        ret = OK;
  
    if (find_allowdeny(r,a-> denys,method)) 
        ret = HTTP_FORBIDDEN;}

else if (a->order[method]== DENY_THEN_ALLOW) { 
    if (find_allowdeny(r,a-> denys,method)) 
        ret = HTTP_FORBIDDEN;

    if (find_allowdeny(r,a-> allows,method)) 
        ret = OK;} 
else
   
   { if (find_allowdeny(r,a-> allows,method) && !find_allowdeny(r,a-> denys,method)) 
    ret = OK; 
else
   
    ret = HTTP_FORBIDDEN;} 

此配置的正确版本为:

Order Deny,Allow 
Deny from 192.168.30.1 

或者只是一行

Deny from 192.168.30.1 

相关内容