正在加载中……
最新消息:欢迎大家访问,导航分类不完善,如果找不到自己想要的文章,可以通过【关键词】来进行搜索,^_^!

防止Nginx+php目录跨站问题

Linux专题 REKFAN.COM 8691浏览 0评论

更多


环境:Nginx +PHP 5.3.0以上版本

解决:防止目录跨站访问

官方说明文档:http://www.php.net/manual/zh/ini.sections.php

vi /etc/php.ini #编辑php.ini配置文件,在最后添加以下代码,修改open_basedir的目录为站点路径
[HOST=www.rekfan.com]
open_basedir=/var/wwwroot/www.rekfan.com/:/tmp/
[PATH=/var/wwwroot/www.rekfan.com]
open_basedir=/var/wwwroot/www.rekfan.com/:/tmp/
#auto_prepend_file=security.php   //允许访问的文件

[HOST=blog.rekfan.com]
open_basedir=/var/wwwroot/blog.rekfan.com/:/tmp/
[PATH=/var/wwwroot/blog.rekfan.com]
open_basedir=/var/wwwroot/blog.rekfan.com/:/tmp/
#auto_prepend_file=security.php

:wq  #保存退出

注:如果有多个站点,依次添加对应域名及目录

service nginx restart #重启nginx
service php-fpm restart #重启php-fpm

方法二:修改源代码方法,以下方法来自互联网,未做测试!

1、解压php源代码。
2、执行编译./configure -- (自带参数)
3、修改源代码。此文件位于main/fopen_wrappers.c

 /* {{{ php_check_open_basedir
 */
PHPAPI int php_check_open_basedir_ex(const char *path, int warn TSRMLS_DC)
{
        /* Only check when open_basedir is available */
        if (PG(open_basedir) && *PG(open_basedir)) {
                char *pathbuf;
                char *ptr;
                char *end;
               
               
/* 此处添加以下任意一段代码 */
               
                /* Check if the path is too long so we can give a more useful error
                * message. */
                if (strlen(path) > (MAXPATHLEN - 1)) {
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "File name is longer than the maximum allowed path length on this platform (%d): %s", MA
XPATHLEN, path);
                        errno = EINVAL;
                        return -1;
                }

                pathbuf = estrdup(PG(open_basedir));

                ptr = pathbuf;

                while (ptr && *ptr) {
                        end = strchr(ptr, DEFAULT_DIR_SEPARATOR);
                        if (end != NULL) {
                                *end = '\0';
                                end++;
                        }

                        if (php_check_specific_open_basedir(ptr, path TSRMLS_CC) == 0) {
                                efree(pathbuf);
                                return 0;
                        }

                        ptr = end;
                }
                if (warn) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "open_basedir restriction in effect. File(%s) is not within the allowed path(s): (%s)",
path, PG(open_basedir));
                }
                efree(pathbuf);
                errno = EPERM; /* we deny permission to open it */
                return -1;
        }

        /* Nothing to check... */
        return 0;
}
/* }}} */

 代码:

  /* 代码一 :添加代码开始 */
  char *env_doc_root;
  env_doc_root = sapi_getenv("DOCUMENT_ROOT", sizeof("DOCUMENT_ROOT")-1 TSRMLS_CC);
  if(env_doc_root){
   int res_root = php_check_specific_open_basedir(env_doc_root, path TSRMLS_CC);
   efree(env_doc_root);
   if (res_root == 0) {
    return 0;
   }
  } 
  /* 代码一 :添加代码结束 */


  /* 代码二 :添加代码开始 */
  char *env_doc_root;
  if(PG(doc_root)){
   env_doc_root = estrdup(PG(doc_root));
  }
  else{
   env_doc_root = sapi_getenv("DOCUMENT_ROOT", sizeof("DOCUMENT_ROOT")-1 TSRMLS_CC);
  }
  if(env_doc_root){
   int res_root = php_check_specific_open_basedir(env_doc_root, path TSRMLS_CC);
   efree(env_doc_root);
   if (res_root == 0) {
    return 0;
   }
   if (res_root == -2) {
    errno = EPERM;
    return -1;
   }
  } 
  /* 代码二 :添加代码结束 */

 
添加以上任意一段代码后,然后执行

make ZEND_EXTRA_LIBS=’-liconv’ make install
cp php.ini-dist /usr/local/php/etc/php.ini
最后修改php.ini中的open_basedir改为:open_basedir = “/var/tmp/:/tmp/”
 
OK啦。就这样了。这样,Nginx就防止跨目录、跨站,哈哈,准确的说是,利用了,PHP的特性。

转载请注明:|REKFAN|系统运维| » 防止Nginx+php目录跨站问题

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址