【问题标题】:PHP: open_basedir allowed pathPHP:open_basedir 允许的路径
【发布时间】:2012-07-21 03:15:03
【问题描述】:

我在一个页面上打了几个电话给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),open_basedir 中包含/启用了目录/home/virtual/domain.com(没有尾部斜杠,因此包括子目录)以及is_dir 中的文件试图迭代的都位于该文件夹下的子文件夹中。那么为什么它们不在允许的路径之内呢?显然他们是!

奇怪的是,此错误似乎仅在 is_dir 返回 false 时出现,即,当文件不是文件夹,而是常规文件时。它似乎可以遍历目录而不会抛出错误。

之前在此处发布过类似问题:Open_basedir restriction oddness(未找到解决方案)。

有人有什么想法吗?

(注意:更改 PHP 设置不是一个选项,因为这是一个共享主机,我没有任何管理员权限)

【问题讨论】:

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

标签: php open-basedir


【解决方案1】:

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

有解释说这不是错误:“这是预期的行为。不存在的非路径(带有斜杠的路径)被认为在 basedir 之外。”,但我不这么认为。仅当路径的第一部分是现有文件时才会触发此错误。

PHP 错误:

【讨论】:

    【解决方案2】:

    原来答案超级简单,但完全不合逻辑:

    在创建(连接)要遍历的路径时,出于某种原因,我硬编码了一个尾部斜杠 - 请注意上面的路径如何以 img/002.JPG/ 结尾,并在末尾添加一个斜杠。删除此斜线修复了错误。这也解释了为什么它在目录(应该有斜杠)上没有失败,只有文件(没有)。

    按照 PHP 文档的说法,如果指定的路径代表现有目录,is_dir() 应该返回 TRUE;和FALSE 在所有其他情况下,包括如果指定的文件不存在(img/002.JPG/ 不存在)。

    所以我仍然有点困惑,为什么它不只是像过去在 PHP 5.2 中那样返回 FALSE,而是让这变得相当深奥,坦率地说是彻头彻尾的错误声明该文件不在允许的路径内……但至少现在它又可以工作了。

    【讨论】:

      猜你喜欢
      • 2016-05-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-24
      • 2014-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多