Apache 虚拟主机中设置 PHP 环境变量,open_basedir 相关

知识回顾:

open_basedir是php.ini中的一个配置选项

它可将用户访问文件的活动范围限制在指定的区域,

假设open_basedir=/home/wwwroot/home/web1/:/tmp/,那么通过web1访问服务器的

用户就无法获取服务器上除了/home/wwwroot/home/web1/和/tmp/这两个目录以外的文件。

注意用open_basedir指定的限制实际上是前缀,而不是目录名。

举例来说: 若"open_basedir = /dir/user", 那么目录 "/dir/user" 和 "/dir/user1"都是

可以访问的。所以如果要将访问限制在仅为指定的目录,请用斜线结束路径名。



1,php_admin_value 和 php_value 区别

相同的地方是:这两个命令都是用来在Apache服务器中针对不同的虚拟主机、目录设置不同的php选项的。

不同的地方是:php_admin_value(php_admin_flag)命令只能用在apache的httpd.conf文件中,而 php_value(php_flag)则是用在.htaccess文件中的。


2,CentOS 8 + Apache 2.4 的虚拟主机中,设置 php_admin_value 和 php_value 必须大写

在虚拟主机配置中添加下面一行:

SetEnv php_value open_basedir=/var/www/_error/:/tmp/


当 php_value 是小写的时候,Core 下的 open_basedir 是空值,只在 PHP Variables 有个记录,并且实际上 PHP 是可以访问其他目录的。如下代码,可以显示所有目录内容。

echo "<pre>";
print_r(scandir("/var/www"));
print_r(scandir("/var/www/_error"));
print_r(scandir("/var"));
echo "</pre>";


只有设置 PHP_VALUE 大写的时候,Core 下的 open_basedir 才有值,open_basedir 才起作用。

SetEnv PHP_VALUE open_basedir=/var/www/_error/:/tmp/ 



3, 更多 open_basedir 安全相关问题

3.1 由于 open_basedir 的设置对 system 等命令执行函数是无效的,所以 disable_function 中一定要禁用 system 函数。

3.2 在Linux环境下,通过symlink完成一些逻辑上的绕过导致可以跨目录操作文件。sysmlink 也需要禁用。



4, Windows 下配置和性能问题参考如下地址

https://javascript.net.cn/article?id=451