php不同运行模式下,生成的$_SERVER变量解析的巨大差异
发布于 作者:苏南大叔 来源:程序如此灵动~全局变量$_ENV
有泄露敏感信息的嫌疑,那么$_SERVER
呢?个别情景下,发生在$_ENV
下的泄露信息的问题,在$_SERVER
身上上演,您敢相信么?苏南大叔本文将描述信息泄露的新可能性$_SERVER
。但是,并不是要对$_SERVER
一棒子打死哦。可能仅仅是特例。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码经验和感悟。本文测试环境:win10
,nginx@1.15.11
,php@8.2.10-nts
。
前文回顾
下面的文章里面,苏南大叔曾经对$_ENV
全局变量,进行过吐槽。槽点主要是:会返回很多和php
毫无关系的系统变量值。比如:PATH
,甚至和Java
相关的m2home
等值。
解决方案就是:
修改php.ini
中的variables_order
,由默认值EGPCS
改成了GPCS
,从而清空了$_ENV
的默认值(敏感信息)。
参考文章:
测试代码
本文的测试代码如下:
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
输出:
在官方下面的这个链接里面,有条消息:
“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.”
大意是:
在cgi
和fastcgi
模式下,$_SERVER
也会从环境变量里面获得数据。S
就同时意味着ES
,并不用考虑在指令中是否存在着E
。(好好琢磨ing)
对比组
值得一提的是:同一台测试机上的,同样的php@8.2.10-nts
。在cli-server
模式下,$_SERVER
却没有敏感信息输出。
php -S test:8080 -t ./
独立php@8.2.10-nts
命令行-S
输出:
在这个版本里面,$_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
变量?
相关链接
- https://newsn.net/say/php-sapi.html
- https://newsn.net/say/mac-php-apache-fpm.html
- https://newsn.net/say/mac-php-apache-mod.html
- https://newsn.net/say/php-www.html
- https://newsn.net/say/php-www-ini.html
- https://newsn.net/say/www-issue-so.html
- https://www.php.net/php_sapi_name
结束语
本文主要以$_SERVER
变量的视角,提出可能的敏感信息泄露的问题。更多php
经验文章,请点击:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。