open_basedir 与会话

open_basedir 与会话

在虚拟主机服务器上,我将每个虚拟主机的 open_basedir 设置为 .:/path/to/vhost/web:/tmp:/usr/share/pear。我有一个运行 WordPress 的客户,他抱怨 open_basedir 错误,如下所示:

PHP 警告:file_exists() [function.file-exists]:open_basedir 限制生效。文件(/var/lib/php/session/sess_42k7jn3vjenj43g3njorrnrmf2)不在允许的路径内:(.:/path/to/vhost/web:/tmp:/usr/share/pear)

因此,PHP 会话 save_path 未包含在 open_basedir 中,但除了此间歇性实例外,服务器上所有站点的会话似乎都运行良好。我认为默认会话处理程序可能忽略了 open_basedir,并且此警告是由 WP 直接访问会话文件引起的。

但是据我所知,PHP 5.2.4 在 session.save_path 配置中引入了 open_basedir 检查:http://www.php.net/ChangeLog-5.php#5.2.4(我使用的是 PHP 5.2.13)。

有任何想法吗?

答案1

在每个虚拟主机路径中为会话创建目录(如“phptmp”)(保留权限和所有者),然后为每个虚拟主机添加 session.save_path、upload_tmp_dir。这是安全的方法。如果您能说明虚拟主机是如何定义的(控制面板,手动),我们可以给出更详细的答案。

答案2

虽然这里的问题是很久以前提出的,但谷歌似乎仍然在这里引导大量流量,而且之前的答案并不安全。

我已经在 Ubuntu 上使用 PHP 7.2 和 7.4 对此进行了测试。PHP 会使用默认处理程序将会话数据写入 open_basedir 目录之外。它不应该与自定义处理程序或旧版本的 PHP 一起使用 - 将来可能不再起作用。因此,确保 session.save_path 在 open_basedir 约束范围内是一种很好的做法。

如果需要在文档根目录中,则需要告诉 Web 服务器不允许 PHP 执行 session.save_path 树中的 PHP。即使您已告诉它只执行扩展名为 .php 的文件中 PHP(还有其他潜在漏洞允许攻击者强制使用会话文件的名称)。

相关内容