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_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 注入、文件包含、命令执行、文件上传等漏洞的代码审计打下基础。

相关推荐
Liquad Li7 小时前
Salesforce 主流认证方式、流程、适用场景
开发语言·salesforce
LOVE️YOU10 小时前
Python 中 Tuple 为什么有时可 Hash,有时不可 Hash?
开发语言·python·哈希算法
李永奉11 小时前
C语言-指针函数与函数指针及回调函数的使用
c语言·开发语言
小oo呆11 小时前
【学习心得】迭代器和可迭代对象
开发语言·python
AC赳赳老秦11 小时前
采集行为合规自检:OpenClaw 自动校验 robots 协议与采集频率,规避违规采集风险
java·开发语言·c++·python·php·deepseek·openclaw
钱栈up11 小时前
mvn compile 卡死在 javac 阶段:一次类型不匹配的排查与修复
java·开发语言
迅猛龙办公室11 小时前
Python输出当前计算机的系统日期和时间
开发语言·前端·python
杨丰玮41811 小时前
C语言基础知识(一)————各类符号的含义与输入输出库(stdio)
c语言·开发语言
剑胆凌锋12 小时前
等级保护测评工程师的困境
网络·安全·web安全·网络安全·职场和发展
程序猿编码12 小时前
工业视觉多任务方案:可编程梯度信息视觉框架,训练评估 + C++ 部署完整实战
开发语言·c++·视觉·推理引擎