如何解决nginx ssi解析include路径问题?

分类:Nginx,工作记 | 作者:凹凸曼 | 发表于2014/02/12

之前站点配置ssi(web服务器apache),用起来木有问题,

最近在川报网服务器配置ssi(WEB服务器nginx),存在问题。

<!–# include virtual=”../../test/test.htm”–> 这种语法格式在apache下木有问题,在nginx就使用不起

nginx 下 <!–# include virtual=”/test/test.htm”–>这种就能用,说明一点nginx解析的时候 不支持”..”路径!

问题应该可以解决 ,毕竟nginx是开源的。

顺便也验证了我之前文章里《工作5年多了,对所处行业环境及技能的一些认识!》提到的为什么开源比闭源的强的原因?

花了点时间 看了一下nginx 的源码 ,如下两个重要的文件表示是ssi模块

src/http/modules/ngx_http_ssi_filter_module.h

src/http/modules/ngx_http_ssi_filter_module.c  这个文件里 的函数 ngx_http_ssi_include 应该就是解释include指令

这个函数 里面 NGX_HTTP_LOG_UNSAFE ,NGX_HTTP_SSI_ERROR 表示的nginx错误信息处理。

那么就找到对应的函数ngx_http_parse_unsafe_uri 在src/http/ngx_http_parse.c里函数具体如下:

gx_int_t
ngx_http_parse_unsafe_uri(ngx_http_request_t *r, ngx_str_t *uri,
    ngx_str_t *args, ngx_uint_t *flags)
{
    u_char  ch, *p;
    size_t  len; 

    len = uri->len;
    p = uri->data;

    if (len == 0 || p[0] == '?') {
        goto unsafe;
    }    

    if (p[0] == '.' && len == 3 && p[1] == '.' && (ngx_path_separator(p[2]))) {
        goto unsafe;
    }    

    for ( /* void */ ; len; len--) {

        ch = *p++;

        if (usual[ch >> 5] & (1 << (ch & 0x1f))) {
            continue;
        }

        if (ch == '?') {
            args->len = len - 1;
            args->data = p;
            uri->len -= len;

            return NGX_OK;
        }

        if (ch == '\0') {
            goto unsafe;
        }

        if (ngx_path_separator(ch) && len > 2) {

            /* detect "/../" */

            if (p[0] == '.' && p[1] == '.' && ngx_path_separator(p[2])) {
                goto unsafe;
            }
        }
    }

    return NGX_OK;

unsafe:

    if (*flags & NGX_HTTP_LOG_UNSAFE) {
        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
                      "unsafe URI \"%V\" was detected", uri);
    }
    return NGX_ERROR;
}

看到 这个 /* detect “/../” */ 注释 你就会明白为什么  不能执行这样的路径 ../../test/test.htm

nginx: 这样的路径存在安全隐患的。

安全的作法不修改nginx,调程序本身的路径,这里就不讨论了,目前的站点木有办法,要用就需要修改ssi模块,再重新编译nginx

修改如下:

src/http/modules/ngx_http_ssi_filter_module.c  这个文件函数 ngx_http_ssi_include里注释掉

if (ngx_http_parse_unsafe_uri(r, uri, &args, &flags) != NGX_OK) {
        return NGX_HTTP_SSI_ERROR;
  }
本文出自 “凹凸曼” 博客,请务必保留此出处 http://www.apoyl.com/?p=1646
Tag:

日志信息 »

该日志于2014-02-12 17:36由 凹凸曼 发表在Nginx, 工作记分类下, 你可以发表评论。除了可以将这个日志以保留源地址及作者的情况下引用到你的网站或博客,还可以通过RSS 2.0订阅这个日志的所有评论。

目前盖楼 (0)层:

发表评论 »

« »