PHP:open_basedir允许路径

6

我有几个关于 is_dir 的调用在一个页面上。它们一直都没有问题。

几天前,主机服务公司将 PHP 从 5.2 升级到了 5.3。自那时以来,我所有对 is_dir 的调用都会导致以下错误(信息):

Warning: is_dir(): open_basedir restriction in effect.
File(/home/virtual/domain.com/public_html/galleries/img/002.JPG/)
is not within the allowed path(s):
(/home/virtual/domain.com:/home/virtual/_tmp)
in /home/virtual/domain.com/public_html/index.php on line 201

这让我感到困惑。
显然,根据错误信息(以及 php_info ),目录 / home / virtual / domain.com (没有尾随斜杠,因此包括子目录)被包含/启用在 open_basedir 中,并且 is_dir 试图迭代的文件都位于该文件夹的子文件夹下。那么它们为什么不在允许的路径内呢?显然它们在!
奇怪的是,这个错误只会在 is_dir 返回 false,即文件不是一个文件夹而是一个普通文件时出现。似乎它可以在不抛出错误的情况下迭代目录。
之前已经有类似的问题在这里发布过:Open_basedir restriction oddness (没有找到解决方案)。
有人有什么想法吗?
(注意:更改PHP设置不是选项,因为这是共享主机,我没有任何管理员访问权限)

这是实际的错误信息吗?还是某些路径中有特殊字符? - SteAp
有些路径确实包含一些特殊字符:&(和号)和_(下划线)。但是,即使这些路径不包含任何特殊字符(除非大写字母算作特殊字符),错误也会出现。而特殊字符都在目录名中(并且在这些情况下正确解析和迭代,其中is_dir评估为TRUE),从未出现在文件名中(这就是错误发生的地方)。 - Janus Bahs Jacquet
2个回答

4
结果证明答案非常简单,却完全不合逻辑:在创建(连接)要迭代的路径时,我错误地硬编码了尾随斜杠-请注意上面路径以 img/002.JPG/ 结尾并带有斜杠。去掉这个斜杠即可修复错误。这也解释了为什么它不会在目录上失败(目录应该有尾随斜杠),而只会在文件上失败(文件没有)。按照 PHP 文档所说,is_dir() 应该返回 TRUE,如果指定的路径表示现有目录; 在所有其他情况下,包括未存在文件的情况(如img/002.JPG/),应返回 FALSE。所以,我仍然有点困惑,为什么它没有像在 PHP 5.2 中那样只是返回 FALSE,而是做出了这个相当晦涩而且实际上是错的陈述,即该文件不在允许的路径内...但至少现在它又可以工作了。

4

在 PHP 中存在一个未修复的 bug,当您打开或检查一个前缀为已存在文件,后缀为不存在部分的路径时,就会触发该 bug。在您的示例中,已存在部分为 /home/virtual/domain.com/public_html/galleries/img/002.JPG,后缀为不存在的 /(路径中的尾随斜杠)。

虽然有解释说这不是 bug:“这是预期行为。不存在的路径(带有斜杠的路径)被视为基目录之外的路径。”,但我不这么认为。只有当路径的第一部分是已存在的文件时,才会触发此 bug。

PHP bugs:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接