【www.gdgbn.com--WebService】

nginx用于大型网站,但是也有一个很大的问题那就是跨域问题,下面我们来看看关于修改php教程源码来解决跨域的问题。下面来看方法。

google搜之有两个比较广为流传的方法,其中最完美的莫过于直接修改php源代码,对打开目录进行鉴权(搜出来的资料最早是anxsoft.com提供的代码)。

因为需要更改php源程序后,重新编译php。在使用fpm方式安装时,打补丁过程中会修改php的文件,所以需要在打完fpm补丁后再修改php源程序。

tar zxvf php-5.2.14.tar.gz
gzip -cd php-5.2.14-fpm-0.5.14.diff.gz | patch -d php-5.2.14 -p1
cd php-5.2.14/

vi  main/fopen_wrappers.c

找到php_check_open_basedir_ex方法,在char *end;和pathbuf = estrdup(pg(open_basedir));之间插入以下的代码:

 

        char path_copy[maxpathlen];
        int path_len;
        path_len = strlen(path);
        if (path_len >= maxpathlen) {
            errno = eperm;
            return -1;
        }
        if (path_len > 0 && path[path_len-1] == php_dir_separator) {
            memcpy(path_copy, path, path_len+1);
            while (path_len > 1 && path_copy[path_len-1] == php_dir_separator) path_len--;
            path_copy[path_len] = "";
            path = (const char *)&path_copy;
        }

        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;
            }
        }


然后编译安装php。

并php.ini的open_basedir配置
open_basedir = "/tmp/:/var/tmp/"

这样就彻底解决了,webshell跨站点目录访问问题

本文来源:http://www.gdgbn.com/asp/29622/