PHP:auto_prepend_file 是不是知道“调用脚本”

Posted

技术标签:

【中文标题】PHP:auto_prepend_file 是不是知道“调用脚本”【英文标题】:PHP: does the auto_prepend_file know of "calling script"PHP:auto_prepend_file 是否知道“调用脚本” 【发布时间】:2014-08-09 09:22:01 【问题描述】:

每当执行脚本时,auto_prepend_file 都会在之前执行。

现在:我想“自定义”这个自动文件,使其根据正在运行的脚本以不同的方式执行(“遵循”auto_prepend 的脚本,或者换句话说,auto_prepend 被添加到的脚本)。有没有办法做到这一点或有人有窍门,他/她是如何做到这一点的?

提前致谢。

【问题讨论】:

【参考方案1】:

我现在已经在多个环境中进行了测试,至少我知道

$GLOBALS['_SERVER']['SCRIPT_FILENAME']

将保存您在正常 php 安装中需要的信息。您的嵌入式系统显然是一个特例,设计人员甚至可能故意从 PHP 中清除了这些信息,以阻止逆向工程。

如果我下面的代码对您没有帮助,那么我认为没有人可以做任何事情来回答这个特定问题,而无需尝试对完全相同的系统进行逆向工程。


我创建了一个函数,它将递归地在任何全局变量中查找任何文件名“.php”。尝试将此添加到您的 auto_prepend_file 的开头:

function recursiveArraySearch($array,$str,$path = array(),$depth=0) 

    if ($depth>4) return;
    if (isset($path[0]) && $path[0] == 'GLOBALS') return;

    foreach ($array as $k=>$v)

        if (is_array($v)) 
            recursiveArraySearch($v,$str,array_merge($path,array($k)),$depth+1);
         else 
            if (!is_resource($v) && strpos($v,$str) !== false) echo "\$GLOBALS['".implode("']['",array_merge($path,[$k]))."'] => $v\n";
        




recursiveArraySearch($GLOBALS,'.php');
die();

(注意:它希望搜索的文件名包含小写的“.php”。) 然后启动您的脚本并查看它显示的内容。

当我在测试时,我正在寻找“testpage.php”。就我而言,这是我从网络服务器运行时得到的结果:

$GLOBALS['_SERVER']['PHP_SELF'] => /testpage.php
$GLOBALS['_SERVER']['SCRIPT_NAME'] => /testpage.php
$GLOBALS['_SERVER']['SCRIPT_FILENAME'] => /var/www/html/testpage.php
$GLOBALS['_SERVER']['PATH_TRANSLATED'] => /testpage.php

这就是我从命令行运行它得到的结果:

$GLOBALS['argv']['0'] => /var/www/html/testpage.php
$GLOBALS['_SERVER']['PHP_SELF'] => /var/www/html/testpage.php
$GLOBALS['_SERVER']['SCRIPT_NAME'] => /var/www/html/testpage.php
$GLOBALS['_SERVER']['SCRIPT_FILENAME'] => /var/www/html/testpage.php
$GLOBALS['_SERVER']['PATH_TRANSLATED'] => /var/www/html/testpage.php
$GLOBALS['_SERVER']['argv']['0'] => /var/www/html/testpage.php

所以在默认 PHP 上,似乎有很多地方可以获取此文件名。

【讨论】:

对不起,在我的系统上,服务器数组不包含此类信息,当脚本运行时未被浏览器调用(在我的情况下,这是绝大多数。 脚本是从命令行运行的吗?像'php somefile.php' 我不知道系统的架构是怎样的,因为没有关于架构的文档......它是一个家庭自动化产品,在“内部”运行 php 服务器,逻辑是用PHP编程。我编写 php 文件并从产品界面启动它们(或按下灯按钮之类的事件启动它们)。我只能说,在这种情况下,$_server 数组不会相应地填充。看来我有点迷路了......【参考方案2】:

没有办法做到这一点。如果没有必要,您甚至不应该使用 auto_prepend_file。只需将文件包含在顶部的调用脚本中即可。基本上它与使用 auto_prepend_file 相同。只是你有更多的灵活性。

PS:我什至不知道你们为什么使用 auto_prepend_file。只需在顶部包含该死的文件就可以了。

【讨论】:

PHP 可以使用该信息(如我的回答所示)。虽然我同意不应该在他们的项目中使用 auto_prepend,但在调试/测试/反向工程/防火墙闭源项目或大型开源项目时这样做很有意义,因为您不想弄乱代码,例如.每次更新时都会覆盖它。

以上是关于PHP:auto_prepend_file 是不是知道“调用脚本”的主要内容,如果未能解决你的问题,请参考以下文章

php auto_prepend_file和auto_append_file的妙用

文件存在检查 php 的 auto_prepend_file

PHP致命错误:未知:将其添加为auto_prepend_file后无法打开所需的'/home/user/pathto/header.php'

auto_prepend_file 删除附加文件的第一行

apache中的php_value auto_prepend_file如何与php一起使用它总是留在内存中吗?

PHP中auto_prepend_file与auto_append_file用法实例分析