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

本专栏将从 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_METHODREQUEST_URIREMOTE_ADDRSERVER_PORTDOCUMENT_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,因为它会同时接收 GETPOSTCOOKIE 数据,容易造成参数来源不明确

  • 通常建议根据业务场景使用 _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 注入、文件包含、命令执行、文件上传等漏洞的代码审计打下基础。

相关推荐
烟锁池塘柳01 小时前
【C/C++】解决C++控制台输出中文乱码问题
c语言·开发语言·c++
C+-C资深大佬1 小时前
Java 变量:从入门到精通
java·开发语言·python
辞旧 lekkk1 小时前
【Qt系统相关】鼠标事件
linux·开发语言·qt·学习·计算机外设·萌新
chouchuang2 小时前
day-027-面向对象-下
开发语言·python
誰能久伴不乏2 小时前
C++11 随机数生成——告别 rand()
开发语言·c++
海清河晏1112 小时前
数据结构 | 二叉平衡搜索树
开发语言·数据结构·visual studio
kuonyuma2 小时前
java之动态代理
java·开发语言
KouFiee2 小时前
同名隐藏基础
开发语言·c++
z落落2 小时前
C# Task WaitAll、WaitAny、WhenAll、WhenAny
开发语言·c#