nginx ssi解析include路径问题解决方法

最近在川报网服务器配置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 == '') {
            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;
  }
 

时间: 2024-09-23 07:29:04

nginx ssi解析include路径问题解决方法的相关文章

nginx缓存不起作用问题解决方法_nginx

1. nginx不缓存原因 默认情况下,nginx是否缓存是由nginx缓存服务器与源服务器共同决定的, 缓存服务器需要严格遵守源服务器响应的header来决定是否缓存以及缓存的时常.header主要有如下: 复制代码 代码如下: Cache-control:no-cache.no-store 如果出现这两值,nginx缓存服务器是绝对不会缓存的 复制代码 代码如下: Expires:1980-01-01 如果出现日期比当前时间早,也不会缓存. 2. 解决不缓存方案 2.1 方法一:修改程序或者

Apache下开启SSI配置使html支持include包含的方法_Linux

写页面的同学通常会遇到这样的烦恼,就是页面上的 html 标签越来越多的时候,寻找指定的部分就会很困难,那么能不能像 javascript 一样写在不同的文件中引入呢?答案是有的,apache 能做到. 举个简单的例子,比如有如下的 html 文件(命名为 index.html): <input type='text' /> <input type='button' value='press' /> 一个简单的文本框和按钮,我现在想把按钮部分的 html 写在另一个 .html 的

tomcat ssi配置及升级导致ssi include错误问题解决

最近tomcat升级版本时,遇到了ssi解析的问题,记录下解决的过程,还有tomcat ssi配置的要点. tomcat 配置SSI的两种方式 Tomcat有两种方式支持SSI:Servlet和Filter. SSIServlet 通过Servlet,org.apache.catalina.ssi.SSIServlet,默认处理"*.shtml"的URL. 配置方式: 修改tomcat的 conf/web.xml文件,去掉下面配置的注释: <servlet> <ser

Nginx提示502 Bad Gateway错误问题解决方法小结

502 Bad Gateway错误问题解决方法 Nginx 502错误的原因比较多,是因为在代理模式下后端服务器出现问题引起的.这些错误一般都不是nginx本身的问题,一定要从后端找原因!但nginx把这些出错都揽在自己身上了,着实让nginx的推广者备受置疑,毕竟从字眼上理解,bad gateway?不就是bad nginx吗?让不了解的人看到,会直接把责任推在nginx身上,希望nginx下一个版本会把出错提示写稍微友好一些,至少不会是现在简单的一句 502 Bad Gateway,另外还不

使用Nginx实现HTTPS双向验证的方法_nginx

https单向验证应用广泛想必大家都很熟悉,我已经在一篇博文中分享过,这次来看看Nginx如何实现双向验证. 单向验证与双向验证的区别: 单向验证: 指客户端验证服务器端证书,服务器并不需要验证客户端证书. 双向验证:指客户端验证服务器端证书,而服务器也需要通过CA的公钥证书来验证客户端证书. 详细的握手过程: 单向验证 浏览器发送一个连接请求给安全服务器. 1.服务器将自己的证书,以及同证书相关的信息发送给客户浏览器. 2.客户浏览器检查服务器送过来的证书是否是由自己信赖的CA中心所签发的.如

linux下Nginx 0.8.40的安装方法_nginx

Nginx作为一个后起之秀,他的迷人之处已经让很多人都投入了他的怀抱.配置简单,实现原理简单.做一个负载平衡的再好不过了. 一.依赖的程序 1. gzip module requires zlib library 2. rewrite module requires pcre library 3. ssl support requires openssl library 二.依赖的程序的安装的方法有两种:一种是比较原始的方法一个一个来安装,另一个是最好的方法用YUM一次性安装 (1).方法一如下

ASP 插入数据, 换行问题解决方法

插入|解决|数据|问题 作用:当插入数据时, 把每行的回车符替换为 <br /> 方法, 只使用简单的 replace 方法-- content_ = replace(request.Form("content"),chr(13),"<br/>") 如使用函数, 可这样使用-- content_ = funcName(request.Form("content")) 文件: insertform.asp--插入数据表单页,

Windows 7访问远程共享文件时0x80070035错误 找不到网络路径解决方法

昨天刚装WIN7系统,今天早上准备访问服务器安装些软件,结果出现网络错误,提示Windows无法访 问共享文件夹,错误代码是0x80070035,提示找不到网络路径.那么是什么原因导致WIN7下无法访问共 享呢? WIN7找不到网络路径分析思路 发现提示找不到网络路径以后,首先ping了服务器 的ip地址,发现可以ping通,其他电脑访问正常.说明不是我的网络问题,而是WIN7系统的设置问题. 在控制面板\网络和 Internet\网络和共享中心\高级共享设置,打开文件共享. 关闭WIN7防火墙

python MySQLdb Windows下安装教程及问题解决方法

  这篇文章主要介绍了python MySQLdb Windows下安装教程及问题解决方法,本文讲解了安装数据库mysql.安装MySQLdb等步骤,需要的朋友可以参考下 使用python访问mysql,需要一系列安装 linux下MySQLdb安装见 Python MySQLdb在Linux下的快速安装 http://www.jb51.net/article/65743.htm ----------------------------------------------------------