PHP代码审计——超全局变量

一、全局变量

全局变量就是在函数外面定义的变量,不能在函数中直接使用,因为他的作用域不会到函数内部,所以在函数内部使用的时候常常看到类似 global $a。

global的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require的所有文件。但是在函数体内定义的global变量,函数体内可以使用,在函数体外定义的global变量不能在函数体内使用,具体看下面示例。

(1)在函数体内定义global变量,函数体内可以使用。
PHP代码审计——超全局变量
(2)在函数体外定义global变量,函数体内不可以使用,但是可以通过超全局变量$GLOBALS使用
PHP代码审计——超全局变量

二、超全局变量

$GLOBALS用于在PHP脚本中的任意位置访问全局变量(从函数或方法中均可)

超全局变量作用域在所有脚本都有效,所以,在函数可直接使用,比如GET_GET、_SERVER都是超全局变量,除了GET_GET、_POST、SERVER_SERVER、_COOKIE等之外的超全局变量保存在$GLOBALS数组中

GLOBALSGLOBALS 数组中,每一个变量为一个元素,键名对应变量名,值对应变量的内容。GLOBALS 之所以在全局范围内存在,是因为 GLOBALSGLOBALS 是一个超全局变量。注意GLOBALS 的写法,比如变量a1,a1,写法为GLOBALS[‘a1’]。

示例:先使用global定义
PHP代码审计——超全局变量
使用$GLOBALS定义全局变量
PHP代码审计——超全局变量
PHP代码审计——超全局变量
PHP代码审计——超全局变量

三、常见超全局变量

常见超全局变量:GLOBALSGLOBALS、_REQUEST、GET_GET、_ENV、SESSION_SESSION、_SERVER、POST_POST、_FILES、$_COOKIE

POST(隐藏传参)
$_POST向服务器传递数据,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION 属性所指的URL地址,用户看不到这个过程

GET(URL传参)
$_GET从服务器上获取数据,把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到

REQUESTphp_REQUEST php中_REQUEST可以获取以POST方法和GET方法提交的数据
比较慢

尽量不要使用REQUEST_REQUEST,应该从_GET、POST_POST、_COOKIE、ENV_ENV、_SERVER等变量中取出需要的值

$_SERVER
参考:https://www.cnblogs.com/wangshuazi/p/9765012.html

$_FILES
$_FILES[‘file’][‘name’]:显示客户端文件的原名称
$_FILES[‘file’][‘type’]:文件的MIME类型,例如:image/gif
$_FILES[‘file’][‘size’]:已上传文件的大小,单位为字节
$_FILES[‘file’][‘tmp_name’]:储存的临时文件名,一般是系统默认
$_FILES[‘file’][‘error’]:该文件上传相关的错误代码

$_SESSION
当前脚本可用SESSION变量的数组
HTTPSESSIONVARS4.1.0HTTP_SESSION_VARS包含相同的信息(4.1.0已废弃),但它不是一个超全局变量 注意:HTTP_SESSION_VARS和$_SESSION是不同的变量,PHP处理它们的方式不同

$_COOKIE
通过HTTP Cookie方式传递给当前脚本的变量的数组
HTTPCOOKIEVARSHTTP_COOKIE_VARS包含相同的信息,但它不是一个超全局变量 注意:HTTP_COOKIE_VARS和$_COOKIE是不同的变量,PHP处理它们的方式不同

$_ENV
$_ENV包含服务器端环境变量的数组,可在PHP程序的任何地方直接访问
$_ENV只是被动的接收服务器端的环境变量转换为数组元素