我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

全局变量$_ENV有泄露敏感信息的嫌疑,那么$_SERVER呢?个别情景下,发生在$_ENV下的泄露信息的问题,在$_SERVER身上上演,您敢相信么?苏南大叔本文将描述信息泄露的新可能性$_SERVER。但是,并不是要对$_SERVER一棒子打死哦。可能仅仅是特例。

苏南大叔:php不同运行模式下,生成的$_SERVER变量解析的巨大差异 - php解析_server变量
php不同运行模式下,生成的$_SERVER变量解析的巨大差异(图4-1)

苏南大叔的“平行空间笔记本”博客,记录苏南大叔的代码经验和感悟。本文测试环境:win10nginx@1.15.11php@8.2.10-nts

前文回顾

下面的文章里面,苏南大叔曾经对$_ENV全局变量,进行过吐槽。槽点主要是:会返回很多和php毫无关系的系统变量值。比如:PATH,甚至和Java相关的m2home等值。

解决方案就是:
修改php.ini中的variables_order,由默认值EGPCS改成了GPCS,从而清空了$_ENV的默认值(敏感信息)。

苏南大叔:php不同运行模式下,生成的$_SERVER变量解析的巨大差异 - variables-order
php不同运行模式下,生成的$_SERVER变量解析的巨大差异(图4-2)

参考文章:

测试代码

本文的测试代码如下:

var_dump(PHP_VERSION);
var_dump(PHP_SAPI);
var_dump(ini_get("variables_order"));
var_dump($_ENV);
var_dump($_SERVER);
foreach($_ENV as $key=>$val){
    if (key_exists($key,$_SERVER)){
        if($_SERVER[$key]==$val){
            unset($_SERVER[$key]);
            unset($_ENV[$key]);
        }
    }
}
var_dump($_SERVER);

因为接下来的问题描述中,如果开启了EGPCS$_ENV$_SERVER的数据,大部分内容都一致。所以,写了一段两者对比的代码,可以看到$_SERVER的独有内容。

现象描述

苏南大叔最近发现:
测试机(win10+nginx@1.15.11+php@8.2.10-nts)上面的$_SERVER也输出了上述敏感信息,而且无关$_ENV变量是否为空,都无差别的输出相关敏感内容。

nginx@1.15.11+php@8.2.10-nts输出:

苏南大叔:php不同运行模式下,生成的$_SERVER变量解析的巨大差异 - 输出一
php不同运行模式下,生成的$_SERVER变量解析的巨大差异(图4-3)

在官方下面的这个链接里面,有条消息:
“Warning:
In both the CGI and FastCGI SAPIs, $_SERVER is also populated by values from the environment; S is always equivalent to ES regardless of the placement of E elsewhere in this directive.”

大意是:
cgifastcgi模式下,$_SERVER也会从环境变量里面获得数据。S就同时意味着ES,并不用考虑在指令中是否存在着E。(好好琢磨ing)

对比组

值得一提的是:同一台测试机上的,同样的php@8.2.10-nts。在cli-server模式下,$_SERVER却没有敏感信息输出。

php -S test:8080 -t ./

独立php@8.2.10-nts命令行-S输出:

苏南大叔:php不同运行模式下,生成的$_SERVER变量解析的巨大差异 - 输出二
php不同运行模式下,生成的$_SERVER变量解析的巨大差异(图4-4)

在这个版本里面,$_ENV$_SERVER两者没有任何的重叠部分。敏感信息都集中在$_ENV中,$_SERVER没有任何敏感信息,非常干净!

解决方案

暂时没有想到合理的解决方案,毕竟修改php.ini中的variables_order,由默认值EGPCS改成了GPC的话,就会置空$_SERVER变量,这显然是不可接受的。置空$_ENV可以接受,是因为很少用这个全局变量$_ENV

$_SERVER变量里面可是有着很多很有用的数据的,苏南大叔经常会使用到里面的数据。所以,暂时就把这种$_SERVER泄露敏感信息的事情,作为个例吧。

php.ini里面有一句话:ENV is not recommended on productions servers。额,那为啥出个$_ENV变量?

相关链接

结束语

本文主要以$_SERVER变量的视角,提出可能的敏感信息泄露的问题。更多php经验文章,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   php