【问题标题】: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 被添加到的脚本)。有没有办法做到这一点或有人有窍门,他/她是如何做到这一点的?

提前致谢。

【问题讨论】:

    标签: php 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,但在调试/测试/反向工程/防火墙闭源项目或大型开源项目时这样做很有意义,因为您不想弄乱代码,例如.每次更新时都会覆盖它。
    猜你喜欢
    • 2011-05-31
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    相关资源
    最近更新 更多