php配置open_basedir防跨站

在网站的运营过程中,经常会出现各种安全问题,其中会出现一种跨站跨目录访问的问题,如A网站出现被上传一个文件管理器或是木马,通过这个文件管理器,却能访问服务器中所有的文件,这对服务器来说是一种非常危险的事件。

这里把有关php.ini中有关防跨站跨目录设置再说一次和在ngingx文件中的配置也发一次,以便作者自己备用,也方便其它网友参考。


名词解释:

open_basedir 将PHP所能打开的文件限制在指定的目录树中,包括文件本身。当程序要使用例如fopen()或file_get_contents()打开一个文件时,这个文件的位置将会被检查。当文件在指定的目录树之外,程序将拒绝打开。本指令不受安全模式打开或关闭的影响。 


添加防跨站配置


使用lnmp 1.4 以上一键环境时,创建站点配置文件时会自动在网站根目录创建.user.ini 文件,该文件不能直接修改,要修改该文件必须先在网站根目录执行命令 chattr +i .user.ini ;然后使用vim 等编辑器修改.user.ini;建议修改完成后取消修改权限,即执行:chattr -i .user.ini;

注:非root账户登录时,需要在命令前添加 sudo


.user.ini 文件内容示例:

open_basedir=/www/wwwroot/zhiwei.com/:/tmp/:/proc/

第二种配置方式:直接在网站配置文件中设置;在location ~ .php {} 块中添加 fastcgi_param


找到网站配置文件;lnmp 环境配置文件默认地址 /usr/local/nginx/conf/vhost

文件示例:

server 
    { 
        listen       80; 
        server_name tbinqc.com; 
        index index.html index.htm index.php join.php; 
        root /mnt/www/tbinqc.com; 
        
        error_page 404 /404.html; 
        location ~ .*\.(html)$ { 
            expires 1d; 
        } 
        location ~ .*\.(js|css)$ { 
            expires 7d; 
        } 
        location ~.php$ { 
            root           html; 
            fastcgi_pass   127.0.0.1:9000; 
            fastcgi_index  index.php; 
            fastcgi_param  SCRIPT_FILENAME /mnt/www/pc515.com$fastcgi_script_name; 
            include        fastcgi_params; 
            fastcgi_param  PHP_VALUE  "open_basedir=/mnt/www/tbinqc.com:/tmp/:/proc/"; 
        } 
        if (!-e $request_filename) { 
            return 404; 
        } 
        if ($host != 'pc515.com' ) { 
            rewrite ^/(.*)$ http://pc515.com/$1 permanent; 
        } 
        access_log /mnt/www/log/pc515.com.log; 
    }

配置说明:

核心代码为fastcgi_param  PHP_VALUE  "open_basedir=/mnt/www/tbinqc.com:/tmp/:/proc/"; 

这一行必须要放include fastcgi_params下面。每个网站(pc515.com.conf)的配置include fastcgi_params下面,如果放在这行上面,可能会被include fastcgi_params中的配置覆盖掉。


用open_basedir指定的限制实际上是前缀,不是目录名。 
也就是说 open_basedir=/home/fdipzone 也会允许访问/home/fdipzone_abc,如果要将访问限制为目录,请使用斜线结束路径名,例如:open_basedir=”/home/fdipzone/”

如果要设置多个目录,window使用;分隔目录,Linux使用:分隔目录。 

删除防跨站配置

LNMP 1.1及之前的版本使用php.ini里面,open_basedir设置

LNMP 1.2及更高版本防跨目录功能使用.user.ini,该文件在网站根目录下,可以修改.user.ini 里面的open_basedir的值来设置限制访问的目录或删除来移除防跨目录的设置。

.user.ini文件无法直接修改,如要修或删除需要先执行:chattr -i /网站目录/.user.ini
可以使用winscp文件管理、vim编辑器或nano编辑器进行修改。
删除的话rm -f /网站目录/.user.ini 就可以。
修改完成后再执行:chattr +i /网站目录/.user.ini
.user.ini不需要重启一般5分钟左右生效,也可以重启一下php-fpm立即生效。
如果要更改网站目录必须要按上述方法修改防跨目录的设置,否则肯定报错!!

LNMP 1.4上如果不想用防跨目录或者修改.user.ini的防跨目录的目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/"; 在该行行前添加 # 或删除改行,需要重启nginx。

LNMP 1.4上也可以直接使用lnmp1.4/tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除。
在Thinkphp、codeigniter、Laravel等框架下,网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。


LNMPA或LAMP 模式1.2版本以上的防跨目录的设置使用的对应apache虚拟主机配置文件(lnmp管理工具添加的话文件是 /usr/local/apache/conf/vhost/域名.conf )里的php_admin_value open_basedir参数进行设置。如果不需要设置可以在前面加 # 进行注释,或自行修改目录的限制。

重启apache生效。


此段转载自lnmp.org

评论

评论列表