-->

PHP:open_basedir的允许路径(PHP: open_basedir allowed pa

2019-09-20 00:46发布

我有几个电话到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的限制奇怪 (没有找到解决方案)。

有人有想法么?

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

Answer 1:

PHP中不固定的错误,当您打开或检查有一个存在的文件作为前缀的路径就被触发,不存在部分作为后缀。 在您的例子有存在部分/home/virtual/domain.com/public_html/galleries/img/002.JPG与不存在的后缀/ (路径斜杠)。

有解释,这是不是一个错误:“这是正常现象。 不存在非路径(具有斜线)被认为是BASEDIR之外。”,但我不这么认为。 此错误只有在路径的第一部分是一个存在的文件触发。

PHP错误:

  • “呼吁文件与斜线的Bug#54419 :: is_dir()抛出,如果open_basedir的警告”
  • “虫#52065 ::警告有关的open_basedir限制在访问文件目录”


Answer 2:

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

当创建(串联)的路径遍历,我不得不由于某种原因硬编码尾部斜杠-注意如何路径的上方在结束img/002.JPG/与在端部具有斜线。 删除此斜线固定的错误。 这也解释了为什么没没上目录(假设有结尾的斜杠),只有文件(不是)。

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

所以,我还是有点不解,为什么它不只是返回FALSE在PHP 5.2中使用的方式,而是让这个相当深奥并坦言只是彻头彻尾的错误声明,该文件是不是在允许的路径中......但至少它现在再次工作。



文章来源: PHP: open_basedir allowed path