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

Tsecer的回音岛

Tsecer的博客

 
 
 

日志

 
 

关于apache中allow deny的语法说明  

2016-04-01 18:19:07|  分类: apache分析 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一、基本权限配置
在apache的使用过程中,可能会遇到文件夹的权限控制问题,尽管大部分时间我们其实是不管这个apache的配置内容的。由于在某些真正的外网部署环境中可能会用到这个配置项,而这个配置项可能有稍微绕了一点,所以这里专门总结apache关于这个规则的语法和语意说明。
这个基本的配置项在apache的httpd-2.4.2\modules\aaa\mod_access_compat.c文件中,首先检测顺序手order指示的确定,该指示的解释规则为:
/* things in the 'order' array */
#define DENY_THEN_ALLOW 0
#define ALLOW_THEN_DENY 1
#define MUTUAL_FAILURE 2

static const char *order(cmd_parms *cmd, void *dv, const char *arg)
{
    access_compat_dir_conf *d = (access_compat_dir_conf *) dv;
    int i, o;

    if (!strcasecmp(arg, "allow,deny"))
        o = ALLOW_THEN_DENY;
    else if (!strcasecmp(arg, "deny,allow"))
        o = DENY_THEN_ALLOW;
    else if (!strcasecmp(arg, "mutual-failure"))
        o = MUTUAL_FAILURE;
    else
        return "unknown order";

    for (i = 0; i < METHODS; ++i)
        if (cmd->limited & (AP_METHOD_BIT << i))
            d->order[i] = o;

    return NULL;
}
总共有三个枚举类型,也即是如果使用了order指示,则只能有"allow,deny" "deny,allow" "mutual-failure"三种参数。由于大部分情况下都没有明确使用这个指令,所以我们关心的就是默认值了,这个默认值的配置在下面函数中实现。其实,从三个枚举值的定义也可以看出来,通常数值为0的为默认值。
static void *create_access_compat_dir_config(apr_pool_t *p, char *dummy)
{
    int i;
    access_compat_dir_conf *conf =
        (access_compat_dir_conf *)apr_pcalloc(p, sizeof(access_compat_dir_conf));

    for (i = 0; i < METHODS; ++i) {
        conf->order[i] = DENY_THEN_ALLOW;
    }
二、order的使用
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) {
        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;
        }
    }

    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;
}    
这里的逻辑比较简单,主要就是不同规则下的默认值不同。如果是ALLOW_THEN_DENY,那么默认值是deny的(“一开始我是拒绝的”),这个选项由于没有怎么用过,所以猜测这种设置背后的逻辑是这样的:
如果是ALLOW_THEN_DENY,那么初始值要和第一个规则相反,假设说设置ALLOW_THEN_DENY的初始值为ALLOW,那么代码流程是这样的:
ret = OK;
if (find_allowdeny(r, a->allows, method)) {
    ret = OK;
}
这样看是不是就没有意义了?所以不同order下默认值是需要和第一个判断规则相反的。从这个来看DENY_THEN_ALLOW的检测是最为宽松的,它的默认规则是允许的;ALLOW_THEN_DENY的限制最为严格,默认拒绝所有;MUTUAL_FAILURE和其它两个的区别在于:MUTUAL_FAILURE要求每个请求都必须满足在“allow”列表并且不在“拒绝”列表;其它两个本质上说只对满足了第一个判断的请求才会再次执行第二次判断,如果不满足第一次判断按照不同的初始值设定。一个显而易见的推论是:对于既没有在allow中出现,也没有在deny中出现的请求,MUTUAL_FAILURE和ALLOW_THEN_DENY是拒绝的;而DENY_THEN_ALLOW是允许的。

  评论这张
 
阅读(84)| 评论(0)
推荐 转载

历史上的今天

评论

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

页脚

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