PHP 手册是不是对“phpinfo()”函数的输出有误导?

Posted

技术标签:

【中文标题】PHP 手册是不是对“phpinfo()”函数的输出有误导?【英文标题】:Is the PHP Manual misguiding regarding the output of 'phpinfo()' function?PHP 手册是否对“phpinfo()”函数的输出有误导? 【发布时间】:2018-11-26 21:57:02 【问题描述】:

我在我的机器上使用 Windows 10 家庭单一语言版,这是一个 64 位操作系统

我已经安装了最新版本的 XAMPP,它已在我的机器上安装了 PHP 7.2.6

我从php Manual的段落中看到以下句子

调用 phpinfo() 函数,你会看到很多有用的 关于您的系统和设置的信息,例如可用的预定义 变量、加载的 PHP 模块和配置设置。

我尝试执行以下脚本并在我的网络浏览器中看到了输出:

<?php phpinfo(); ?>

我仔细检查了整个输出。在phpinfo() 的输出中,我只能看到$_SERVER 预定义变量以及特定于我机器上设置的可能索引。

但是 PHP 中的其他预定义变量呢? $GLOBALS、$_GET、$_POST、$_FILES、$_COOKIE、$_SESSION、$_REQUEST、$_ENV、$http_response_header、$argc、$argv

根据PHP Manual 中的文字所说,所有上述预定义变量及其各自的值都应显示在脚本&lt;?php phpinfo(); ?&gt; 的输出中,但它没有发生。为什么这样?

PHP 手册中的文字是否误导了 PHP 用户?

还是我对 PHP 手册中的文字理解有误?

请详细解释一下。

【问题讨论】:

您是将phpinfo(); 放在脚本末尾还是作为新文件?如果它是一个新文件,那么显然没有上下文。 您是否在phpinfo() 的页面上发布过帖子? url中是否有任何变量?你不会看到不存在的东西。 @Scuzzy :我放在 .php 文件中的唯一内容是 那么这些变量中没有显示,它们根本不会被填充 【参考方案1】:

正如您在PHP source code for phpinfo() 中看到的那样,它将显示有问题的变量:

    if (flag & PHP_INFO_VARIABLES) 
        zval *data;

        SECTION("PHP Variables");

        php_info_print_table_start();
        php_info_print_table_header(2, "Variable", "Value");
        if ((data = zend_hash_str_find(&EG(symbol_table), "PHP_SELF", sizeof("PHP_SELF")-1)) != NULL && Z_TYPE_P(data) == IS_STRING) 
            php_info_print_table_row(2, "PHP_SELF", Z_STRVAL_P(data));
        
        if ((data = zend_hash_str_find(&EG(symbol_table), "PHP_AUTH_TYPE", sizeof("PHP_AUTH_TYPE")-1)) != NULL && Z_TYPE_P(data) == IS_STRING) 
            php_info_print_table_row(2, "PHP_AUTH_TYPE", Z_STRVAL_P(data));
        
        if ((data = zend_hash_str_find(&EG(symbol_table), "PHP_AUTH_USER", sizeof("PHP_AUTH_USER")-1)) != NULL && Z_TYPE_P(data) == IS_STRING) 
            php_info_print_table_row(2, "PHP_AUTH_USER", Z_STRVAL_P(data));
        
        if ((data = zend_hash_str_find(&EG(symbol_table), "PHP_AUTH_PW", sizeof("PHP_AUTH_PW")-1)) != NULL && Z_TYPE_P(data) == IS_STRING) 
            php_info_print_table_row(2, "PHP_AUTH_PW", Z_STRVAL_P(data));
        
        php_print_gpcse_array(ZEND_STRL("_REQUEST"));
        php_print_gpcse_array(ZEND_STRL("_GET"));
        php_print_gpcse_array(ZEND_STRL("_POST"));
        php_print_gpcse_array(ZEND_STRL("_FILES"));
        php_print_gpcse_array(ZEND_STRL("_COOKIE"));
        php_print_gpcse_array(ZEND_STRL("_SERVER"));
        php_print_gpcse_array(ZEND_STRL("_ENV"));
        php_info_print_table_end();

但是,如您所见,当 a) 超全局存在(依赖于 SAPI)并且 b) 它实际上包含值时,它使用 php_print_gpcse_array 打印其中的每个键/值对。

TL;DR:不,PHP 手册在这方面没有误导性。

【讨论】:

以上是关于PHP 手册是不是对“phpinfo()”函数的输出有误导?的主要内容,如果未能解决你的问题,请参考以下文章

PHP安全函数phpinfo()

PHP phpinfo()函数

PHP imagepng函数 问题

PHP 代码审计代码执行注入

如何在Linux服务器上查看PHP信息

phpinfo()找不到gd项怎么办?