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

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

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

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

 

 代码如下 复制代码
<value name="pid_file">/usr/local/php/logs/php-fpm.pid</value>
<value name="error_log">/usr/local/php/logs/php-fpm.log</value>
<value name="listen_address">/tmp/wwww.111cn.net.sock</value>
<value name="user">www.111cn.net</value>  #PHP-CGI运行用户组
<value name="group">www.111cn.net</value>

启动PHP-CGI进程:

 代码如下 复制代码

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

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

 代码如下 复制代码

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

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

 

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

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

 代码如下 复制代码
#! /bin/sh
# chkconfig: 2345 55 25
#http://www.111cn.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.111cn.net]
open_basedir=/var/wwwroot/www.111cn.net/:/tmp/
[PATH=/var/wwwroot/www.111cn.net]
open_basedir=/var/wwwroot/www.111cn.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;
}

时间: 2024-07-30 18:50:48

Nginx中php-fpm进程目录权限防跨站配置的相关文章

Nginx防跨目录与跨站配置方法

Nginx有一个缺陷,就是没有像apache的php_value_basedir给我们限制php文件访问目录,PHP低版本下,fastcgi 模式 下open_base设置无效,PHP在PHP5.3.3以上已经增加了HOST配置,可以起到防跨站.跨目录的问题 如果你是PHP 5.3.3以上的版本,可以修改/usr/local/php/etc/php.ini在末尾里加入: [HOST=111cn.net]  代码如下 复制代码 open_basedir=/home/wwwroot/111cn.ne

php配置防跨站、防跨目录安全

  现在很多网站都是采用php建站,不少都是直接使用现在成熟的cms程序,这些php开发的cms系统本身安全性可能并不高,这时就需要我们在服务器做一些针对php程序配置防跨站.防跨目录等一些设置,可以有效的防止服务器上所有的php网站被恶意篡改. 适用范围及演示系统 适用范围:php5.3及以上版本 演示系统:centos 防跨站.防跨目录安全设置方法 第1步:登录到linux系统终端. 第2步:找到并打开php配置文件. 第3步:在php.ini最底部添加以下代码,并保存.大家可就按以下代码改

LNMP下防跨站、跨目录安全设置,仅支持PHP 5.3.3以上版本

如果你是PHP 5.3.3以上的版本,可以修改/usr/local/php/etc/php.ini在末尾里加入:  代码如下 复制代码 [HOST=www.vpser.net] open_basedir=/home/wwwroot/www.vpser.net/:/tmp/ [PATH=/home/wwwroot/www.vpser.net] open_basedir=/home/wwwroot/www.vpser.net/:/tmp/ 按上面的这个例子修改,换成你自己的域名和目录,多个网站就按上

LNMP下防跨站、跨目录的安全设置,仅支持PHP5.3.3以上版本_Linux

如果你是PHP 5.3.3以上的版本,可以修改/usr/local/php/etc/php.ini在末尾里加入: [HOST=www.jb51.net] open_basedir=/home/wwwroot/www.jb51.net/:/tmp/ [PATH=/home/wwwroot/www.jb51.net] open_basedir=/home/wwwroot/www.jb51.net/:/tmp/ 按上面的这个例子修改,换成你自己的域名和目录,多个网站就按上面的例子改成多个,最后重启ph

Nginx下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

vps中nginx+php5.3防跨站跨目录问题设置

个很重要,做站,安全意识一定要高. 即使被攻陷了网站,服务器也不能被攻陷啊. 像我现在的VPS,装的是lnmp环境,放了若干个站,包括朋友的站,权限一定是设置好,每个站都相互隔离,也与系统隔离. 因为我装的是PHP5.3,所以可以在php.ini里面进行设置,所以其实这并不是nginx的设置. 在php.ini最后面加下面设置则可:  代码如下 复制代码 [HOST=111cn.net] open_basedir = "/www/www.xxx.com:/www/tmp/www.xxx.com&

Nginx服务器中为网站或目录添加认证密码的配置详解_nginx

nginx可以为网站或目录甚至特定的文件设置密码认证.密码必须是crypt加密的.可以用apache的htpasswd来创建密码. 格式为: htpasswd -b -c site_pass username password site_pass为密码文件.放在同nginx配置文件同一目录下,当然你也可以放在其它目录下,那在nginx的配置文件中就要写明绝对地址或相对当前目录的地址. 如果你输入htpasswd命令提示没有找到命令时,你需要安装httpd.如果是centos可以执行如下来安装,

linux中CHMOD命令修改目录权限数字含义

以下是使用绝对模式修改目录权限常见数字代表的含义示例: 模式 意义 777 所有用户都对文件具有读.写和执行权限 755 文件所有者对文件具有读.写和执行权限;组用户和其他用户对文件需有读和执行权限 711 文件所有者对文件具有读.写和执行权限;组用户和其他用户对文件具有执行权限 644 文件所有者可以读.写文件;组用户和其他用户可以读文件 640 文件所有者可以读.写文件;组用户可以读文件;其他用户不能访问文件   另一种常见的符号模式含义: who 用户类型 意义 u User 文件的所有者

php 防跨站攻击测试例子(供学习使用)

代码是最好的语言..  代码如下 复制代码 <?php #demo for prevent csrf /** * enc */ function encrypt($token_time) { return md5('!@##$@$$#%43′ . $token_time); } $token_time = time(); $token = encrypt($token_time); $expire_time = 10; if ($_POST) { $_token_time = $_POST['t