如果一个apache服务器中存在多个虚拟主机,想在站点目录之间进行隔离,提高安全性,个人总结最完善的方法如下:

一、修改php.ini添加所有php要涉及到的目录白名单

二、apache虚拟机再单独配置每个站点php程序需要涉及到的目录

 

例:对以下三个站点进行隔离

 

/data/webroot/web1 t1.com

/data/webroot/web2 t2.com

/data/webroot/web3 t3.com

一、修改php.ini

open_basedir = "/tmp:/data/webroot/web1:/data/webroot/web2:/data/webroot/web3"

注:

1、如果不想对某个站点进行权限限制,也必须存在此目录,否则php文件无法访问

2、如果只配置了此参数,apache中不对虚拟机做任何配置,则会影响全局

3、如果真的想只配置php.ini,不对apache中的每个站点进行配置,可以使用"目录+多位随机码"格式这种不易被猜到的同级站点目录名,如:

open_basedir = "/tmp:/data/webroot/web1_8DS932:/data/webroot/web2_SF3SKG:/data/webroot/web3_90DLFD"

这种方法可能对存在很多虚拟机的服务器中比较简便。不推荐……

二、修改apache虚拟机配置文件

 

    ServerAdmin [email protected]

    DocumentRoot "/data/webroot/web1"

    ServerName t1.com

    php_admin_value open_basedir "/tmp:/data/webroot/web1"

    ServerAdmin [email protected]

    DocumentRoot "/data/webroot/web2"

    ServerName t2.com

    php_admin_value open_basedir "/tmp:/data/webroot/web2"

    ServerAdmin [email protected]

    DocumentRoot "/data/webroot/web3"

    ServerName t3.com

    php_admin_value open_basedir "/tmp:/data/webroot/web3"

(完成)

注:

1、如果只配置了php.ini则会影响“全局没有使用php_admin_value配置的站点”,但所有含有php程序的站点目录必须存在于php.ini白名单中。

2、如果不配置php.ini,只配置其中一台虚拟主机,那么其它站点还是不安全的。