我想通过 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