注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Tsecer的回音岛

Tsecer的博客

 
 
 

日志

 
 

apache中order及allow、deny处理  

2012-11-17 15:29:19|  分类: apache分析 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一、基本权限控制
这三个应该是apache的三个基本的目录控制权限,也是偶尔遇到,所以看代码简单分析一下,因为网络上很多说明都并不是很简单直白,总之是有点绕吧,这里结合代码简单分析一下。
二、apache的判断代码
httpd-2.4.2\modules\aaa\mod_access_compat.c
static int check_dir_access(request_rec *r)
{
    int method = r->method_number;
    int ret = OK;
    access_compat_dir_conf *a = (access_compat_dir_conf *)
        ap_get_module_config(r->per_dir_config, &access_compat_module);

    if (a->order[method] == ALLOW_THEN_DENY) {如果order是allow 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) {对于deny之后allow执行该分支
        if (find_allowdeny(r, a->denys, method)) {如果是deny之后allow,那么默认是所有的可以通过
            ret = HTTP_FORBIDDEN;
        }另一方面,之前的判断结果和下一次的判断结果不是逻辑与关系,对于任何一个访问,它要经过所有的检测,最后一个适用于该访问的返回结果生效,正如apache的文档里所说,这个和防火墙的行为不同
        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;
        }
    }

    if (ret == HTTP_FORBIDDEN) {
        ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(01797)
                      "client denied by server configuration: %s%s",
                      r->filename ? "" : "uri ",
                      r->filename ? r->filename : r->uri);
    }

    return ret;
}
三、为什么初始值不同
对于任何一种模式的,它的默认初始值都是和它的第一个操作是相反的,否则第一个判断就没有意义。例如,对于deny allow模式,如果默认就是deny,那么第一个规则的deny就是对某些特定访问地址、那等于说初始值是拒绝所有访问,接下来规则是拒绝其中的某些访问,这显然是一个冗余的无意义操作,因此是否通过的默认初始值要和第一个判断规则相反。
  评论这张
 
阅读(414)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017