【发布时间】:2014-08-09 09:22:01
【问题描述】:
每当执行脚本时,auto_prepend_file 都会在之前执行。
现在:我想“自定义”这个自动文件,使其根据正在运行的脚本以不同的方式执行(“遵循”auto_prepend 的脚本,或者换句话说,auto_prepend 被添加到的脚本)。有没有办法做到这一点或有人有窍门,他/她是如何做到这一点的?
提前致谢。
【问题讨论】:
每当执行脚本时,auto_prepend_file 都会在之前执行。
现在:我想“自定义”这个自动文件,使其根据正在运行的脚本以不同的方式执行(“遵循”auto_prepend 的脚本,或者换句话说,auto_prepend 被添加到的脚本)。有没有办法做到这一点或有人有窍门,他/她是如何做到这一点的?
提前致谢。
【问题讨论】:
我现在已经在多个环境中进行了测试,至少我知道
$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 上,似乎有很多地方可以获取此文件名。
【讨论】:
没有办法做到这一点。如果没有必要,您甚至不应该使用 auto_prepend_file。只需将文件包含在顶部的调用脚本中即可。基本上它与使用 auto_prepend_file 相同。只是你有更多的灵活性。
PS:我什至不知道你们为什么使用 auto_prepend_file。只需在顶部包含该死的文件就可以了。
【讨论】: