上一篇掌握了 PHP 基础语法,这一篇进入核心:超全局变量。用户通过浏览器提交的所有数据 —— 地址栏参数、表单内容、本地缓存 ——PHP 都通过超全局变量获取。理解了
$_GET、$_POST、$_COOKIE、$_SESSION,才算真正入门 PHP Web 开发,也才能看懂 SQL 注入、越权等漏洞的原理。
一、超全局变量概述
超全局变量是 PHP 官方预定义的全局数组,最大特点是:不受作用域限制,在页面任意位置、函数内部、循环内部都可以直接调用,无需global声明。
它是前后端数据交互的核心工具,也是 PHP 开发和网络安全入门的基础知识点。
| 超全局变量 | 数据来源 | 存储位置 | 典型用途 |
|---|---|---|---|
$_GET | URL 地址栏参数 | 客户端 | 分页、搜索、详情页跳转 |
$_POST | HTTP 请求体表单数据 | 客户端 | 登录、注册、文件上传 |
$_COOKIE | 浏览器本地 Cookie | 客户端 | 记住登录状态、个性化配置 |
$_SESSION | 服务端会话存储 | 服务端 | 登录状态、权限、购物车 |
$_REQUEST | GET+POST+COOKIE 合并 | 混合 | 项目中严禁使用 |
二、$_GET —— 地址栏传参
2.1 核心概念
$_GET专门用于获取 URL 地址栏参数。当浏览器通过地址栏携带参数访问 PHP 文件时,PHP 自动将所有参数解析并存入$_GET数组。
URL 参数格式:文件路径?键名=值&键名2=值2,?为参数起始标识,多个参数用&拼接。
2.2 取值示例
\<?php // 访问 get.php?username=admin\&password=123456 if (isset($\_GET\["username"]) && isset($\_GET\["password"])) {   \$username = $\_GET\["username"];   \$password = $\_GET\["password"];   echo "用户名:" . \$username . ",密码:" . \$password; } ?>2.3 核心特征
- 明文可见、可篡改:所有参数直接展示在地址栏,用户可随意修改参数值,绝对不能传递密码、手机号、支付信息等敏感数据
- 长度受限:受浏览器和服务器配置限制,GET 请求参数总长度默认不超过 2KB
- 可缓存、可分享:带参数的 URL 可以收藏、复制分享,适合分页、搜索、详情页跳转等公开场景
2.4 易错点
- 参数键名严格区分大小写:
$_GET['User']和$_GET['user']是两个不同参数 - 地址栏无对应参数时直接取值会报错,建议使用容错写法:
$page = $_GET['page'] ?? 1;
2.5 安全风险
$_GET参数是SQL 注入攻击的高频入口。攻击者可直接在地址栏拼接恶意 SQL 语句,若 PHP 未做数据过滤,直接将 GET 参数拼接进 SQL 查询语句,会导致数据库数据泄露、被篡改、被删除。
防护思路:所有 GET 传入的参数必须做格式校验和特殊字符转义,禁止直接拼接 SQL。
三、$_POST —— 表单数据提交
3.1 核心概念
$_POST用于获取 HTTP 请求体中的表单数据,主要接收前端 form 表单 POST 方式提交的数据,是项目中数据提交的核心方式。
3.2 取值示例
\<?php if ($\_SERVER\["REQUEST\_METHOD"] == "POST" &&   isset($\_POST\["username"]) && isset($\_POST\["password"])) {   \$username = $\_POST\["username"];   \$password = $\_POST\["password"];   echo "用户名:" . \$username . ",提交方式:POST"; } ?> \<form method="POST" action="post.php">   \<input type="text" name="username">   \<input type="password" name="password">   \<button type="submit">登录\</button> \</form>3.3 核心特征
- 隐藏传输,非加密:数据存放在请求体中,不显示在地址栏,但只是隐藏不加密
- 无固定长度限制:理论上可传输大容量数据,支持文本、图片、文件上传
- 不可缓存分享:POST 提交的数据不会被浏览器缓存,无法通过 URL 分享
3.4 易错点
- 表单
method必须设置为post,否则数据会通过 GET 方式传输,$_POST无法取值 input标签必须设置name属性,PHP 通过 name 值接收数据
3.5 安全风险
POST 数据全程明文传输,在局域网中可通过 Wireshark 抓包、浏览器 F12 网络面板直接查看提交的账号密码。因此所有涉及账号、密码、支付的线上项目,必须配置 HTTPS 协议加密传输。
四、$_COOKIE —— 客户端缓存数据
4.1 核心概念
Cookie 是服务端下发、客户端浏览器存储的小型文本数据(最大 4KB)。用户每次访问网站,浏览器自动携带当前域名下的所有 Cookie,PHP 通过$_COOKIE读取。
核心定位:数据存在用户电脑,不归服务器管控。
4.2 设置与读取
\<?php // 设置 Cookie:必须在页面所有输出内容之前执行 setcookie("username", "shiba", time() + 3600, "/"); // 读取 Cookie \$name = isset($\_COOKIE\['username']) ? $\_COOKIE\['username'] : 'Guest'; echo "欢迎您:" . \$name; ?>注意:
setcookie()必须在页面所有输出之前执行(包括空格、HTML 标签、echo 输出),否则会直接报错。
4.3 常用业务场景
- 记住登录状态:存储加密后的用户 ID、昵称
- 个性化配置:记录用户设置的网页主题、字体大小、语言版本
- 浏览记录:简单记录用户浏览过的商品、页面
4.4 安全风险
Cookie 存储在客户端,用户可通过浏览器开发者工具随意查看、修改、删除,安全性极低。
- 禁止存储:密码、权限标识、余额、私密信息等敏感数据
- 高危漏洞:若直接通过 Cookie 中的
admin=1判断管理员权限,用户可手动修改 Cookie 值实现越权提权
五、$_SESSION —— 服务端会话存储
5.1 核心概念
Session 是服务端会话技术,数据全部存储在服务器磁盘 / 内存中,客户端仅保存唯一的session_id标识。相比 Cookie,安全性大幅提升,是项目中保存登录状态的主流方案。
5.2 操作流程
\<?php // 开启会话:必须写在页面第一行,所有代码和 HTML 输出之前 session\_start(); // 存储会话数据 $\_SESSION\['username'] = 'shijiu'; // 读取会话数据 echo "当前用户:" . $\_SESSION\['username']; ?>Session 文件在 phpstudy 中的存储路径:D:\phpStudy\PHPTutorial\tmp\tmp(根据安装路径灵活查询)。
5.3 核心特征
- 安全可靠:数据存储在服务端,用户无法直接查看、篡改
- 一对一绑定:每个访问用户拥有唯一
session_id,服务器通过该标识区分不同用户 - 场景专属:用于保存登录状态、用户权限、购物车、临时验证码等核心数据
5.4 安全风险
Session 的唯一漏洞为会话劫持:若攻击者通过 XSS 跨站脚本攻击窃取用户的session_id,可在自己浏览器伪造该标识,冒充用户登录。
基础防护:定期更新
session_id、设置会话过期时间、禁止跨域获取 Cookie。
六、$_REQUEST —— 为什么项目中严禁使用
6.1 基本作用
$_REQUEST可以同时接收 GET、POST、COOKIE 三种来源的数据,写法简单但项目中严禁使用。
6.2 禁用核心原因
| 问题 | 说明 |
|---|---|
| 数据来源模糊 | 无法判断数据来自地址栏、表单还是 Cookie,报错时难以调试 |
| 参数覆盖风险 | Cookie 参数优先级高于 GET/POST,攻击者可自定义 Cookie 值覆盖前端合法参数 |
6.3 真实安全案例
某网站后台使用$_REQUEST['user_id']获取当前登录用户 ID。攻击者在浏览器中手动设置 Cookie:user_id=1(管理员 ID),该 Cookie 值直接覆盖 POST 表单传递的普通用户 ID,成功越权访问后台所有管理功能。
开发最佳实践:查询、分页用
$_GET;表单提交、数据操作用$_POST;客户端缓存数据用$_COOKIE,全程杜绝$_REQUEST。
七、Web 完整交互流程
理解超全局变量的工作原理,需要梳理浏览器、Web 服务器、PHP 解释器的完整请求流程:
- 浏览器发起请求:用户输入网址、提交表单,自动生成请求参数。URL 参数对应
$_GET、表单 POST 数据对应$_POST、本地 Cookie 对应$_COOKIE - 服务器接收转发:Apache/Nginx 接收浏览器请求,判断文件类型,将 PHP 文件请求转发给 PHP 解释器
- PHP 解析填充变量:PHP 解释器自动解析请求数据,批量填充所有超全局变量,开发者可直接调用
- PHP 执行业务逻辑:操作会话数据、处理参数、拼接页面、读写数据库
- 返回渲染页面:PHP 生成完整 HTML 页面,通过服务器返回浏览器,完成页面展示
核心总结:超全局变量是 PHP 解析器自动封装的请求数据,无需手动接收,直接调用即可。
八、数据库交互与 SQL 注入防护
8.1 动态网站完整数据流
真实项目中,PHP 的核心作用是衔接用户和数据库:
- 浏览器发起请求,携带 GET/POST 用户参数(如搜索关键词、用户 ID)
- Web 服务器转发请求至 PHP 解释器
- PHP 接收超全局变量参数,连接 MySQL 数据库
- 将参数带入 SQL 语句,执行查询、新增、修改、删除操作
- 数据库返回执行结果,PHP 将数据嵌入 HTML 模板
- 生成动态页面,返回浏览器展示
8.2 核心安全重点
用户通过$_GET、$_POST提交的所有数据,都是不可信数据!
若直接将用户输入参数拼接进 SQL 语句,未做过滤、转义、校验,会触发SQL 注入漏洞,攻击者可窃取全站数据、删除数据表、篡改用户权限,是 Web 开发中最基础、最致命的漏洞之一。
基础防护方案:
- 参数类型强制校验
- 特殊字符转义
- 禁止直接拼接 SQL
- 使用预处理语句(Prepared Statement)
九、知识小结
| 超全局变量 | 数据来源 | 安全性 | 核心用途 | 一句话速记 |
|---|---|---|---|---|
$_GET | URL 地址栏 | 低(明文可见) | 分页、搜索、跳转 | 查东西用 GET |
$_POST | 请求体 | 中(隐藏不加密) | 登录、注册、上传 | 传数据用 POST |
$_COOKIE | 客户端存储 | 极低(可篡改) | 记住状态、个性化 | 存在用户电脑 |
$_SESSION | 服务端存储 | 高 | 登录状态、权限 | 存在服务器 |
$_REQUEST | GET+POST+COOKIE | 危险(参数覆盖) | 严禁使用 | 项目中禁用 |
核心安全原则:所有用户输入数据必须过滤校验,杜绝 SQL 注入和越权漏洞。
从
$_GET到$_SESSION,从地址栏到服务端,超全局变量构成了 PHP Web 交互的完整数据通道。安全视角下,每一个超全局变量都是攻击面 ——GET 是 SQL 注入入口,Cookie 是越权入口,Session 是会话劫持目标。理解数据从哪里来、存在哪里、是否可信,是 Web 安全的第一课。