如何禁用 php 全局变量 $_ENV,解决潜在安全性问题
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
在上一篇文章中,苏南大叔打印了php的全局变量$_ENV
,瞬间就被雷到了。可以说这个$_ENV
变量,真心有泄露服务器敏感信息的嫌疑。因为里面列出了不少和php
不相关的环境变量内容。比如苏南大叔测试机上面的node
或者java
相关的环境变量设置等。
暂时还没有想到如何利用这个$_ENV
变量漏洞,但是出于安全角度出发,苏南大叔认为:还是应该禁用这个$_ENV
变量才对。
修改php.ini
禁用$_ENV
为了禁用掉$_ENV
变量,在php.ini
中,需要找到如下设置:variables_order
。默认情况下,这个值是:EGPCS
。其中的E
就表示$_ENV
。所以,苏南大叔把variables_order
改为GPCS
。这样设置保存后,再次访问$_ENV
变量的时候,$_ENV
就显示为空,不会泄露敏感信息了。
variables_order | $_ENV |
---|---|
EGPCS | 敏感信息数组 |
GPCS | 空数组 |
是否会影响getenv()
函数呢?
没有啥影响,即使$_ENV
初始值为空,getenv()
也是该拿到的还能拿到,两者不是来源的关系。名字中的env
只不过是个巧合。正常情况下,使用export
导入的环境变量,还是能够使用getenv()
函数获取的。
注意:测试环境是mac
,所以可以使用export
设置环境变量,win
下请使用set
。
www
服务的启动命令:
export aaa=bbb && php -S localhost:9001 -t ./ -c php.ini
检测专用php代码:
echo "<pre>";
var_dump($_ENV);
echo getenv("aaa");
php.ini中的设置:
variables_order = "GPCS"
截图显示,我们的代码getenv()
依然可以检测到export
设置的相关环境变量参数值。
总结
为了安全性考虑,关闭$_ENV
全局变量,不乏是个好的措施。
更多php
相关经验文章。请点击下面这个链接支持苏南大叔:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。