☰
新手勇闯网络安全 | PHP 基础(二)
2026/10/11 2:19:07 网站建设 项目流程

上一篇掌握了 PHP 基础语法,这一篇进入核心:超全局变量。用户通过浏览器提交的所有数据 —— 地址栏参数、表单内容、本地缓存 ——PHP 都通过超全局变量获取。理解了$_GET、$_POST、$_COOKIE、$_SESSION,才算真正入门 PHP Web 开发,也才能看懂 SQL 注入、越权等漏洞的原理。


一、超全局变量概述

超全局变量是 PHP 官方预定义的全局数组,最大特点是:不受作用域限制,在页面任意位置、函数内部、循环内部都可以直接调用,无需global声明。

它是前后端数据交互的核心工具,也是 PHP 开发和网络安全入门的基础知识点。

超全局变量数据来源存储位置典型用途
$_GETURL 地址栏参数客户端分页、搜索、详情页跳转
$_POSTHTTP 请求体表单数据客户端登录、注册、文件上传
$_COOKIE浏览器本地 Cookie客户端记住登录状态、个性化配置
$_SESSION服务端会话存储服务端登录状态、权限、购物车
$_REQUESTGET+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"])) { &#x20; \$username = $\_GET\["username"]; &#x20; \$password = $\_GET\["password"]; &#x20; 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" && &#x20; isset($\_POST\["username"]) && isset($\_POST\["password"])) { &#x20; \$username = $\_POST\["username"]; &#x20; \$password = $\_POST\["password"]; &#x20; echo "用户名:" . \$username . ",提交方式:POST"; } ?> \<form method="POST" action="post.php"> &#x20; \<input type="text" name="username"> &#x20; \<input type="password" name="password"> &#x20; \<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 解释器的完整请求流程:

  1. 浏览器发起请求:用户输入网址、提交表单,自动生成请求参数。URL 参数对应$_GET、表单 POST 数据对应$_POST、本地 Cookie 对应$_COOKIE
  2. 服务器接收转发:Apache/Nginx 接收浏览器请求,判断文件类型,将 PHP 文件请求转发给 PHP 解释器
  3. PHP 解析填充变量:PHP 解释器自动解析请求数据,批量填充所有超全局变量,开发者可直接调用
  4. PHP 执行业务逻辑:操作会话数据、处理参数、拼接页面、读写数据库
  5. 返回渲染页面:PHP 生成完整 HTML 页面,通过服务器返回浏览器,完成页面展示

核心总结:超全局变量是 PHP 解析器自动封装的请求数据,无需手动接收,直接调用即可。


八、数据库交互与 SQL 注入防护

8.1 动态网站完整数据流

真实项目中,PHP 的核心作用是衔接用户和数据库:

  1. 浏览器发起请求,携带 GET/POST 用户参数(如搜索关键词、用户 ID)
  2. Web 服务器转发请求至 PHP 解释器
  3. PHP 接收超全局变量参数,连接 MySQL 数据库
  4. 将参数带入 SQL 语句,执行查询、新增、修改、删除操作
  5. 数据库返回执行结果,PHP 将数据嵌入 HTML 模板
  6. 生成动态页面,返回浏览器展示

8.2 核心安全重点

用户通过$_GET、$_POST提交的所有数据,都是不可信数据!

若直接将用户输入参数拼接进 SQL 语句,未做过滤、转义、校验,会触发SQL 注入漏洞,攻击者可窃取全站数据、删除数据表、篡改用户权限,是 Web 开发中最基础、最致命的漏洞之一。

基础防护方案:

  • 参数类型强制校验
  • 特殊字符转义
  • 禁止直接拼接 SQL
  • 使用预处理语句(Prepared Statement)

九、知识小结

超全局变量数据来源安全性核心用途一句话速记
$_GETURL 地址栏低(明文可见)分页、搜索、跳转查东西用 GET
$_POST请求体中(隐藏不加密)登录、注册、上传传数据用 POST
$_COOKIE客户端存储极低(可篡改)记住状态、个性化存在用户电脑
$_SESSION服务端存储高登录状态、权限存在服务器
$_REQUESTGET+POST+COOKIE危险(参数覆盖)严禁使用项目中禁用

核心安全原则:所有用户输入数据必须过滤校验,杜绝 SQL 注入和越权漏洞。


从$_GET到$_SESSION,从地址栏到服务端,超全局变量构成了 PHP Web 交互的完整数据通道。安全视角下,每一个超全局变量都是攻击面 ——GET 是 SQL 注入入口,Cookie 是越权入口,Session 是会话劫持目标。理解数据从哪里来、存在哪里、是否可信,是 Web 安全的第一课。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询