现在的位置: 首页Nginx>正文
FreeBSD下php修改源代码解决nginx虚拟主机防webshell跨目录 [原创]
2011年05月06日 Nginx 评论数 6 ⁄ 被围观 13,645 次+

测试环境FreeBSD7.4+php5.2.17+mysql5.1.56+nginx1.0.1(亲测可用)

apache因为有php_admin_value open_basedir 可以限制webshell跨目录,可是nginx目前没有这样的模块支持。

之前网上也有人通过每个站点使用单独的conf,使php-cgi开启不同的端口来区分开,达到防webshell跨目录的目的,但本人所用生产环境经测还是不行,所以就从修改php的源代码来着手

随即从网上找了下,确实有很多种修改源码的方法,但是经过测试都没有成功,无奈还得从源代码研究,经过多种测试最终解决了,编译php时修改代码(main/fopen_wrappers.c 的232-245行修改如下:)

  1. /* 修改代码 begin */  
  2.         char *env_document_root = sapi_getenv("DOCUMENT_ROOT"sizeof("DOCUMENT_ROOT")-1 TSRMLS_CC);           
  3.         char temp[500] = {'\0'};   
  4.         strcpy(temp, ptr);   
  5.         char *iPos = strrchr(temp, ':');   
  6.         if (iPos)   
  7.         {   
  8.             temp[strlen(temp) - strlen(iPos) + 1] = '\0';   
  9.             ptr = strcat(temp, env_document_root);   
  10.         }   
  11.         efree(env_document_root);   
  12.   
  13.         while (ptr && *ptr) {   
  14.             end = strchr(ptr, DEFAULT_DIR_SEPARATOR);   
  15.             if (end != NULL) {   
  16.                 *end = '\0';   
  17.                 end++;   
  18.             }   
  19.   
  20.             if (php_check_specific_open_basedir(ptr, path TSRMLS_CC) == 0) {   
  21.                 efree(pathbuf);   
  22.                 return 0;   
  23.             }   
  24.   
  25.             ptr = end;   
  26.         }   
  27. /* 修改代码 end */  

并在php.ini中启用open_basedir如

  1. open_basedir=/tmp/:/usr/local/www/

如果不想修改的话,可以下载已经修改好的文件替换即可!

本文地址:http://www.92csz.com/37/575.html
如非注明则为本站原创文章,欢迎转载。转载请注明转载自:moon's blog
 

目前有 6 条留言 其中:访客:3 条, 博主:3 条

  1. 无心无情 : 2011年05月07日12:14:03  -49楼

    博主的链接已加~!

    • clairelume : 2011年05月07日12:22:46

      😛 😛 😛

  2. 飘逸 : 2012年03月12日16:31:07  -48楼

    解压密码说多少啊

    • clairelume : 2012年03月12日16:33:28

      你试试www.92csz.com

  3. ken : 2013年02月02日00:43:18  -47楼

    open_basedir 会让访问量大的服务器压力剧增,开销太大,最终放弃

    • clairelume : 2013年02月05日17:10:48

      访问量大的服务器,都是单台单用了,还要open_basedir何用 🙁