PHP代码审计基础——超全局变量(三)

发布时间:2026/7/13 2:50:43
PHP代码审计基础——超全局变量(三) 本专栏将从 PHP 最基础的知识点 开始循序渐进地讲解代码审计中必须掌握的内容包括超全局变量、危险函数、文件操作、反序列化、魔术方法等核心知识为后续学习漏洞原理和源码审计打下坚实基础。文章目录什么是PHP超全局变量第一个变量 $GLOBALS第二个变量 $_SERVER第三个参数 $_REQUEST第四个变量 $_GET 和 $_POST总结大家感兴趣的可以看往期的文章PHP代码审计基础——Cookie详细讲解一PHP代码审计基础—Session详细讲解二什么是PHP超全局变量PHP 预定义了多个超全局变量Superglobals它们可以在脚本的任意作用域中直接访问包括函数和类的方法内部无需使用global关键字进行声明。PHP 常用的超全局变量包括$GLOBALS$_SERVER$_REQUEST$_POST$_GET$_FILES$_ENV$_COOKIE$_SESSION这些变量主要用于获取请求数据、服务器环境信息、Cookie、Session、文件上传数据等是 PHP 开发和代码审计过程中最常接触、也是最重要的数据来源。第一个变量 $GLOBALS作用$GLOBALS可以在整个 PHP 脚本的任意作用域中访问包括函数和类的方法内部。它本质上是一个数组用于保存当前脚本中定义的所有全局变量其中数组的键Key就是变量名数组的值Value就是对应变量的值。通过访问$GLOBALS[变量名]可以在局部作用域中直接读取或修改全局变量而无需使用global关键字。下面通过一个简单的示例来了解$GLOBALS的基本用法?php$x10;$y23;functionaddition(){$GLOBALS[z]$GLOBALS[x]$GLOBALS[y];}addition();echo$z;?# 最终结果 33以上实例中 z 是⼀个$GLOBALS数组中的超级全局变量该变量同样可以在函数外访问。第二个变量 $_SERVER作用$_SERVER用于保存服务器环境和当前请求的相关信息例如请求头Header、请求路径、脚本路径、请求方法、客户端 IP、服务器信息等。需要注意的是$_SERVER中的内容由Web 服务器自动生成不同的服务器或运行环境提供的字段可能存在差异因此并不能保证所有键都一定存在。# 简单给大家展示一下结果?phpechopre;print_r($_SERVER);echo/pre;可以看到该函数所包含的值都是一些我们感兴趣的值?phpecho$_SERVER[PHP_SELF];echobr;echo$_SERVER[SERVER_NAME];echobr;echo$_SERVER[HTTP_HOST];echobr;echo$_SERVER[HTTP_REFERER];echobr;echo$_SERVER[HTTP_USER_AGENT];echobr;echo$_SERVER[SCRIPT_NAME];?得到结果如下除了上述几个常用参数外$_SERVER还包含了大量服务器环境和请求相关的信息例如REQUEST_METHOD、REQUEST_URI、REMOTE_ADDR、SERVER_PORT、DOCUMENT_ROOT等。由于不同 Web 服务器提供的字段可能存在差异这里不再一一列举建议直接查阅 PHP 官方文档其中对每个参数都进行了详细说明。PHP 官方文档$_SERVERhttps://www.php.net/manual/zh/reserved.variables.server.php如果想了解PHP 所有预定义变量Superglobals可以参考 https://www.php.net/manual/zh/reserved.variables.php第三个参数 $_REQUEST作用$_REQUEST用于获取客户端提交的数据。它默认包含$_GET、$_POST和$_COOKIE中的数据具体取决于 PHP 配置。当用户提交表单后可以通过$_REQUEST[参数名]获取对应的参数值无需关心数据是通过GET还是POST方式提交。下面通过一个简单的示例来了解$_REQUEST的基本用法htmlbodyform methodpostaction?php echo$_SERVER[PHP_SELF]; ?Name:input typetextnamefnameinput typesubmit/form?php$name$_REQUEST[fname];echo$name;?/body/html该示例实现了一个简单的PHP 表单提交通过$_REQUEST获取用户输入的数据并输出到页面。页面加载 → 用户输入内容 → 点击 Submit → POST 提交 → $_REQUEST[fname] → echo 输出页面注意 在实际开发和代码审计中一般不推荐使用$_REQUEST因为它会同时接收GET、POST和COOKIE数据容易造成参数来源不明确通常建议根据业务场景使用 $_GET 或 $_POST这样代码更加安全、可读性也更高。第四个变量 $_GET 和 $_POST$_GET用于获取URL 查询字符串中提交的参数常用于搜索、分页、详情页等通过 URL 传递数据的场景。$_POST用于获取HTTP POST 请求体中提交的数据常用于登录、注册、表单提交、文件上传等需要提交数据的场景。?php// 获取 URL 中 GET 请求的 id 参数例如test.php?id1$id$_GET[id];echo$id;// 获取 POST 请求中的 u 参数例如uadmin$u$_POST[u];echo$u;// 获取 REQUEST 中的 cmd 参数可能来自 GET、POST 或 COOKIE// 并输出为cmdxxxechocmd.$_REQUEST[cmd];?1GET传参效果如下2POST传参效果如下修改GET改为POST添加Content-Type:参数效果如下REQUEST的作用获取 cmd 参数可能来自 GET、POST 或 COOKIE总结本文介绍了 PHP 中常用的超全局变量包括$_GLOBALS、$_SERVER、$_REQUEST、$_GET和$_POST的基本作用及使用方式并结合代码示例和 Burp Suite 抓包演示帮助大家理解不同变量的数据来源及应用场景。超全局变量是 PHP 代码审计中最基础、也是最重要的知识点之一。只有熟悉数据的传递过程才能更好地分析程序逻辑为后续学习 SQL 注入、文件包含、命令执行、文件上传等漏洞的代码审计打下基础。