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'