知识回顾:
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