在网站的运营过程中,经常会出现各种安全问题,其中会出现一种跨站跨目录访问的问题,如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