本专栏将从 PHP 最基础的知识点 开始,循序渐进地讲解代码审计中必须掌握的内容,包括超全局变量、危险函数、文件操作、反序列化、魔术方法等核心知识,为后续学习漏洞原理和源码审计打下坚实基础。
文章目录
-
- 什么是PHP超全局变量
-
- [第一个变量 GLOBALS](#第一个变量 GLOBALS)
- [第二个变量 _SERVER](#第二个变量 _SERVER)
- [第三个参数 _REQUEST](#第三个参数 _REQUEST)
- [第四个变量 _GET 和 _POST](#第四个变量 _GET 和 _POST)
- 总结
大家感兴趣的可以看往期的文章:
什么是PHP超全局变量
PHP 预定义了多个超全局变量(Superglobals) ,它们可以在脚本的任意作用域 中直接访问,包括函数和类的方法内部,无需使用 global 关键字进行声明。
PHP 常用的超全局变量包括:
bash
$GLOBALS
$_SERVER
$_REQUEST
$_POST
$_GET
$_FILES
$_ENV
$_COOKIE
$_SESSION
这些变量主要用于获取请求数据、服务器环境信息、Cookie、Session、文件上传数据 等,是 PHP 开发和代码审计过程中最常接触、也是最重要的数据来源。
第一个变量 $GLOBALS
作用: $GLOBALS 可以在整个 PHP 脚本的任意作用域中访问,包括函数和类的方法内部。
它本质上是一个数组,用于保存当前脚本中定义的所有全局变量,其中数组的键(Key)就是变量名,数组的值(Value)就是对应变量的值。
通过访问 $GLOBALS['变量名'],可以在局部作用域中直接读取或修改全局变量,而无需使用 global 关键字。
下面通过一个简单的示例来了解 $GLOBALS 的基本用法:
php
<?php
$x = 10;
$y = 23;
function addition() {
$GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
}
addition();
echo $z;
?>
# 最终结果 33
以上实例中 z 是⼀个$GLOBALS数组中的超级全局变量,该变量同样可以在函数外访问。
第二个变量 $_SERVER
作用: $_SERVER 用于保存服务器环境 和当前请求的相关信息,例如请求头(Header)、请求路径、脚本路径、请求方法、客户端 IP、服务器信息等。
需要注意的是,$_SERVER 中的内容由 Web 服务器自动生成,不同的服务器或运行环境提供的字段可能存在差异,因此并不能保证所有键都一定存在。
php
# 简单给大家展示一下结果
<?php
echo "<pre>";
print_r($_SERVER);
echo "</pre>";

可以看到该函数所包含的值都是一些我们感兴趣的值:
php
<?php
echo $_SERVER['PHP_SELF'];
echo "<br>";
echo $_SERVER['SERVER_NAME'];
echo "<br>";
echo $_SERVER['HTTP_HOST'];
echo "<br>";
echo $_SERVER['HTTP_REFERER'];
echo "<br>";
echo $_SERVER['HTTP_USER_AGENT'];
echo "<br>";
echo $_SERVER['SCRIPT_NAME'];
?>
得到结果如下:

除了上述几个常用参数外,$_SERVER 还包含了大量服务器环境和请求相关的信息,例如 REQUEST_METHOD、REQUEST_URI、REMOTE_ADDR、SERVER_PORT、DOCUMENT_ROOT 等。
由于不同 Web 服务器提供的字段可能存在差异,这里不再一一列举,建议直接查阅 PHP 官方文档,其中对每个参数都进行了详细说明。
PHP 官方文档($_SERVER): https://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 的基本用法:
php
<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>
<?php
$name = $_REQUEST['fname'];
echo $name;
?>
</body>
</html>
该示例实现了一个简单的 PHP 表单提交 ,通过 $_REQUEST 获取用户输入的数据并输出到页面。
text
页面加载 → 用户输入内容 → 点击 Submit → POST 提交 → $_REQUEST['fname'] → echo 输出页面
注意: 在实际开发和代码审计中,一般不推荐使用 $_REQUEST,因为它会同时接收
GET、POST和COOKIE数据,容易造成参数来源不明确
- 通常建议根据业务场景使用 _GET 或 _POST,这样代码更加安全、可读性也更高。
第四个变量 _GET 和 _POST
$_GET 用于获取 URL 查询字符串 中提交的参数,常用于搜索、分页、详情页等通过 URL 传递数据的场景。
$_POST 用于获取 HTTP POST 请求体 中提交的数据,常用于登录、注册、表单提交、文件上传等需要提交数据的场景。
php
<?php
// 获取 URL 中 GET 请求的 id 参数,例如:test.php?id=1
$id = $_GET["id"];
echo $id;
// 获取 POST 请求中的 u 参数,例如:u=admin
$u = $_POST["u"];
echo $u;
// 获取 REQUEST 中的 cmd 参数(可能来自 GET、POST 或 COOKIE)
// 并输出为:cmd=xxx
echo "cmd=" . $_REQUEST["cmd"];
?>
(1)GET传参效果如下:

(2)POST传参效果如下:
修改:
- GET改为POST
- 添加
Content-Type:参数

效果如下:

REQUEST的作用:获取 cmd 参数(可能来自 GET、POST 或 COOKIE);
总结
本文介绍了 PHP 中常用的超全局变量,包括 $_GLOBALS、$_SERVER、$_REQUEST、$_GET 和 $_POST 的基本作用及使用方式,并结合代码示例和 Burp Suite 抓包演示,帮助大家理解不同变量的数据来源及应用场景。
超全局变量是 PHP 代码审计中最基础、也是最重要的知识点之一。只有熟悉数据的传递过程,才能更好地分析程序逻辑,为后续学习 SQL 注入、文件包含、命令执行、文件上传等漏洞的代码审计打下基础。