微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP`require_once`包含错误的文件

在这样的Linux Ubuntu 14.04-LTS机器上有一个开发树,有三个相同的分支:

main -+-- leonardo --- project --- htdocs -+- panel --- index.PHP
      |                                    |
      |                                    +- config.PHP
      |
      +-- federico --- project --- htdocs -+- panel --- index.PHP
      |                                    |
      |                                    +- config.PHP
      |
      +-- carlo ------ project --- htdocs -+- panel --- index.PHP
      |                                    |
      |                                    +- config.PHP
    ..... (you get my drift).

既没有软链接也没有硬链接. config.PHP文件在svn-ignore中,并且在所有分支之间是不同的

一个Apache服务器,每个开发人员都有一个virtualHost,所以我可以看到我的开发版本是http://leonardo.project.local或Federico的http://federico.project.local.

在调查当前的怪异时,这两个文件是:

<?PHP // this is panel/index.PHP
    echo "I am " . __FILE__ . "\n";
    echo "I will include " . realpath('../config.PHP') . "\n";
    require_once '../config.PHP';

<?PHP // this is config.PHP
    echo "I am " . __FILE__ . "\n";
    exit();

预期的产出当然是:

I am leonardo/project/htdocs/panel/index.PHP
I will include /var/www/main/leonardo/project/htdocs/config.PHP
I am leonardo/project/htdocs/config.PHP

但实际输出是:

I am leonardo/project/htdocs/panel/index.PHP
I will include /var/www/main/leonardo/project/htdocs/config.PHP
I am federico/project/htdocs/config.PHP

另外的奇怪之处在于

    echo "I will include " . realpath('../config.PHP') . "\n";
    require_once realpath('../config.PHP');

作品.

TL; DR require_once和realpath不同意’../config.PHP’的实际位置.

真奇怪的是我没看到在leonardo / project / htdocs / panel /中运行的脚本如何知道federico / project / htdocs / config.PHP;它应该去四个目录,然后探索很多子目录.

我几乎开始怀疑这可能是文件系统甚至内核相关的东西.

文件系统是ext4,内核是3.13.0-55-generic#92-Ubuntu SMP Sun Jun 14 18:32:20 UTC 2015 x86_64 x86_64 x86_64 GNU / Linux.该机器是最新VMware Workstation上的虚拟x64.

检查

> PHP的include_path只包括.和/usr/local/PHP5 / pear.
>如前所述,分支中没有文件是符号链接,所有涉及文件的inode计数表示没有交叉链接.文件确实不同.
>所有文件都在那里,它不是“最后一个包括”.
>从命令行,在leonardo …面板中,我运行“cat ../config.PHP”,我得到了我的config.PHP,正如预期的那样.只有PHP才能包含错误文件.
>重启Apache(以防万一)没有任何帮助.我接下来会尝试重启整个虚拟机,但要做到这一点,我需要冻结几个服务,这需要一段时间.
>到昨天一切都很笨拙(我当时不在这里).在过去三天内没有系统更新,没有重新启动,甚至没有远程登录.正常运行时间为8天.
>我是个白痴:通过检查集成测试日志,我也可以知道这一点何时开始发生.已经要求他们,午饭后期待他们.

解决方法:

你检查过任何潜在的操作码缓存及其设置吗?
在过去,我遇到了一些问题,例如没有检测到已更改的文件.

具体而言,如果将opcache.use_cwd设置设置为零,则会出现这种情况.

opcache.use_cwd boolean

If enabled, OPcache appends the current working directory to the script key, thereby eliminating possible collisions between files with
the same base name. disabling this directive improves performance,
but may break existing applications.

如果发生这种情况,则访问不同目录中给定名称文件的第一个用户PHPunit脚本(例如leonardo / config.PHP vs federico / config.PHP)将使用该文件“填充”缓存.诸如realpath之类的文件系统功能不会受到影响并将继续工作.使用绝对路径的引用将继续工作.具有相对路径的参考将以一种非常阴险的方式被打破.

因为在你只有一个人工作之前,那个人已经根据他的需要准备了缓存,并且什么也没注意到.然后你回来工作,然后开始加载他的文件.

另外,该设置可能会导致无意的信息泄露,因为该设置是系统范围的.因此,您知道您的ISP有一个损坏的use_cwd,您知道另一个站点包含’../inc/credit_cards.PHP’,您在站点中准备相同的路径并包含一个具有相同名称文件. get_defined_vars()可能会让您使用其他站点登录数据库系统. (没有检查,但鉴于发生了什么,不明白为什么不).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐