一聚教程网:一个值得你收藏的教程网站

热门教程

Nginx中php-fpm进程目录权限防跨站配置

时间:2022-06-30 18:50:14 编辑:袖梨 来源:一聚教程网


Nginx下开多个虚拟机网站防跨站是首要的任务,PHP5.3之前的版本不支持open_basedir,只能通过控制PHP-cgi进程及目录用户权限进行限制,防止跨站访问。

先了解一下网站正常运行所用到的用户、目录权限:
Nginx进程运行用户:接收用户请求,处理静态文件,如果是PHP则转给PHP-CGI处理,网站目录拥有读权限。
PHP-cgi进程用户:处理PHP文件,网站目录拥有读权限,个别目录需要写入权限。

让每个网站使用单独的PHP-CGI进程,创建PHP-FPM配置文件,修改以下:

 

 代码如下 复制代码
/usr/local/php/logs/php-fpm.pid
/usr/local/php/logs/php-fpm.log
/tmp/wwww.111com.net.sock
www.111com.net  #PHP-CGI运行用户组
www.111com.net

启动PHP-CGI进程:

 代码如下 复制代码

/usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/www.111com.net.conf


设置网站目录权限,设Nginx运行用户为www:

 代码如下 复制代码

chown -R www.111com.net:www /home/wwwroot/www.111com.net
chmod -R 550 /home/wwwroot/www.111com.net
chmod 701 /home/wwwroot/


再修改Nginx网站配置文件,解析PHP所使用的PHP-CGI进程:

 

 代码如下 复制代码
location ~ .*.(php|php5)?$
{
fastcgi_pass  unix:/tmp/www.111com.net.sock;
fastcgi_index index.php;
include fcgi.conf;
}

php-cgi进程简单管理脚本:

 代码如下 复制代码
#! /bin/sh
# chkconfig: 2345 55 25
#http://www.111com.net
cgi=/usr/local/php/bin/php-cgi
case "$1" in
    start)
        for conf in `ls /usr/local/php/etc/*.conf`
        do
            $cgi --fpm --fpm-config $conf
        done
    ;;
 
    stop)
        for pid in `ls /usr/local/php/logs/*.pid`
        do
                kill -TERM `cat $pid`
        done
    ;;
 
    restart)
        $0 stop
        $0 start
    ;;
 
 
    *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
    ;;
 
esac

方法二,如果你是PHP 5.3.3以上版本 ,可参考下面方法,因为这个就更简单了

在5.3.3以上已经增加了HOST配置,可以起到防跨站、跨目录的问题。如果你是PHP 5.3.3以上的版本,可以修改/usr/local/php/etc/php.ini在末尾里加入:


vi /etc/php.ini #编辑php.ini配置文件,在最后添加以下代码,修改open_basedir的目录为站点路径

 代码如下 复制代码

[HOST=www.111com.net]
open_basedir=/var/wwwroot/www.111com.net/:/tmp/
[PATH=/var/wwwroot/www.111com.net]
open_basedir=/var/wwwroot/www.111com.net/:/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

方法三,防WEBshell 跨站


作者亲测,需要更改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
*/
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;

// 添加的内容开始

               char *env_document_root = sapi_getenv("DOCUMENT_ROOT", sizeof("DOCUMENT_ROOT")-1 TSRMLS_CC);
                if (php_check_specific_open_basedir(ptr, path TSRMLS_CC) == 0) {
                        efree(env_document_root);
                        return 0;
                }

                // 添加的内容结束

                pathbuf = estrdup(PG(open_basedir));

                ptr = pathbuf;

                while (ptr && *ptr) {
                        end = strchr(ptr, DEFAULT_DIR_SEPARATOR);
                        if (end != NULL) {
                                *end = '';
                                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;
}

热门栏目