如何放宽 PHP 的 open_basedir 限制?

Posted

技术标签:

【中文标题】如何放宽 PHP 的 open_basedir 限制?【英文标题】:How can I relax PHP's open_basedir restriction? 【发布时间】:2010-09-18 10:29:48 【问题描述】:

open_basedir 限制 php 在目录树中可以打开的文件。

我将几个类库和配置文件存储在我的 Web 根目录之外。这样,Web 服务器就不会让它们公开访问。但是,当我尝试从我的应用程序中包含它们时,我得到一个 open_basedir 限制错误,如下所示:

警告:realpath() [function.realpath]:open_basedir 限制生效。 文件(/var/www/vhosts/domain.tld/zend/application) 不在允许的路径内: (/var/www/vhosts/domain.tld/httpdocs:/tmp) 在 /var/www/vhosts/domain.tld/httpdocs/index.php 在第 5 行

我的网络根目录在这里:

/var/www/vhosts/domain.tld/httpdocs

我的库和配置目录在这里:

/var/www/vhosts/domain.tld/zend

放宽 open_basedir 限制以便域文件夹下的目录树可供我的应用程序使用的最佳解决方法是什么?我有许多域想要这样做,而且我显然也对创建安全漏洞持谨慎态度。

注意:我使用的是 CentOS、Apache、Plesk,并且我拥有对服务器的 root ssh 访问权限。虽然这并不直接适用于 Zend Framework,但我在本例中使用它。所以这里是 Zend 的引导程序中包含的内容:

define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../zend/application/'));
set_include_path(APPLICATION_PATH . '/../zend/library' . PATH_SEPARATOR . get_include_path());

【问题讨论】:

【参考方案1】:

将您需要访问的路径 (/var/www/vhosts/domain.tld/zend) 添加到您的 open_basedir 指令中(您可以在 windows 中使用路径分隔符 ':' 或 ';' 指定多个路径)

请注意,open_basedir 中的值是前缀,这意味着 /var/www/vhosts/domain.tld/zend 下的任何内容都可以访问

【讨论】:

【参考方案2】:

您也可以使用 Apache(假设这是您的 Web 服务器)配置文件(例如 httpd.conf)在每个目录的基础上轻松完成此操作

<Directory /var/www/vhosts/domain.tld/httpdocs>
php_admin_value open_basedir "/var/www/vhosts/domain.tld/httpdocs:/var/www/vhosts/domain.tld/zend"
</Directory>

你也可以完全解除限制

<Directory /var/www/vhosts/domain.tld/httpdocs>
php_admin_value open_basedir none
</Directory>

【讨论】:

如果 op 正在运行 plesk,他需要稍微特别一点:toosweettobesour.com/2008/02/02/plesk-open_basedir-workaround tom:完全取消限制不会造成安全漏洞吗? dcousineau:谢谢! Brian:你只会删除从 /var/www/vhosts/domain.tld/httpdocs 运行的 php 文件的限制,但是第一个选项更好 php_admin_value open_basedir none 解决了我的问题。谢谢【参考方案3】:

在 Parallels Plesk Panel(例如 1and1)中,您可以在 PHP 面板设置中执行此操作:

这里:

【讨论】:

谢谢伊戈尔,但为什么是“ex: 1and1”?他们不允许 PHP 覆盖吗? 是的,但只是通过他们的面板。也许混淆是因为ex这个词,我改成了例如

以上是关于如何放宽 PHP 的 open_basedir 限制?的主要内容,如果未能解决你的问题,请参考以下文章

php绕过open_basedir设置

PHP open_basedir - 返回值?

从PHP底层看open_basedir bypass

为啥在 IIS 上使用 open_basedir 和 PHP 作为 FastCGI?

open_basedir

php 环境require(): open_basedir restriction in effect 错误