Web 漏洞与防御机制实验报告

------ 基于 Token 与 Session 的 CSRF 防护设计与验证

**实验等级:★★★★★**​

适用场景:网络安全实验 / Web 安全课程设计 / 信息安全期末大作业


一、实验概述

1.1 实验名称

CSRF 漏洞防御机制验证实验

1.2 实验目的

  1. 理解 CSRF(跨站请求伪造)漏洞的形成原理;

  2. 掌握基于 Token 的 CSRF 防御机制;

  3. 验证 Token 的一次性有效性;

  4. 使用 Burp Suite 复现并阻断 CSRF 攻击。

1.3 实验意义

CSRF 是一种利用浏览器信任机制的攻击方式,其危害隐蔽且广泛。

本实验通过最小可用系统(Minimal Viable System),剥离业务复杂性,聚焦于安全机制本身,验证 Token 防护的有效性。


二、实验原理

2.1 CSRF 攻击模型

CSRF 攻击成立需同时满足以下条件:

条件 说明
用户已登录 浏览器保存合法 Cookie
请求可伪造 参数结构简单
服务端无二次校验 仅依赖 Session
用户触发请求 点击链接或自动提交

攻击者利用的是 **"浏览器自动携带凭证"**​ 的特性,而非窃取凭证。


2.2 Token 防御原理

Token 防御机制的核心思想是:

在"身份合法"的基础上,额外验证"请求来源合法"。

Token 工作流程
  1. 服务端生成随机 Token

  2. Token 存入 Session

  3. 表单以隐藏字段提交 Token

  4. 服务端校验 Token

  5. 校验完成后立即销毁 Token


三、实验环境

项目 说明
操作系统 Windows
Web 服务 PHPStudy(Apache + PHP)
浏览器 Firefox
测试工具 Burp Suite
开发语言 PHP
数据存储 password.txt

四、实验过程与结果分析

4.1 登录模块设计与验证

4.1.1 登录页面(login.html)
复制代码
<form action="login1.php" method="POST">
    username:<br>
    <input type="text" name="username"><br>
    password:<br>
    <input type="text" name="password"><br>
    <input type="submit" value="Submit">
</form>
4.1.2 登录逻辑(login1.php)
复制代码
<?php
session_start();
if ($_POST['username'] === 'admin' && $_POST['password'] === 'admin') {
    $_SESSION["admin"] = 1;
    echo "登录成功";
}
?>

验证结果

Session 成功写入,用户处于已认证状态。


4.2 带 Token 的密码修改模块

4.2.1 管理页面(manage-defense.php)
复制代码
<?php
session_start();
if ($_SESSION["admin"] != 1) die("Not admin");

$csrf_token = sha1(mt_rand() . time() . "Impossible");
$_SESSION["csrf_token"] = $csrf_token;
?>
<form action="add-pass.php" method="GET">
    <input type="hidden" name="csrf_token" value="<?= $csrf_token ?>">
</form>

4.2.2 密码修改逻辑(add-pass.php)
复制代码
<?php
session_start();
if ($_SESSION["admin"] != 1) die("Not admin");

$token = $_GET['csrf_token'];
if (!isset($_SESSION["csrf_token"]) || $_SESSION["csrf_token"] !== $token) {
    die("CSRF attack detected!");
}

if ($_GET['password_new'] === $_GET['password_conf']) {
    file_put_contents("password.txt", $_GET['password_new']);
}

unset($_SESSION["csrf_token"]);
?>

4.3 防御效果验证

测试项 结果
正常提交 ✅ 成功
重复 Token ❌ 拦截
删除 Token ❌ 拦截
篡改 Token ❌ 拦截

结论:Token 机制有效阻止 CSRF 攻击。


五、实验分析与讨论

5.1 为什么 Session 不够?

Session 解决的是 **"你是谁"**​

Token 解决的是 "这次请求是不是你发的"

二者互补,不可替代。


5.2 Token 的一次性为何关键?

若 Token 可复用,则:

  • 攻击者可保存请求

  • 随时重放

  • 防御失效

因此:

复制代码
unset($_SESSION["csrf_token"]);

是防御体系中的关键控制点


六、实验结论

  1. CSRF 攻击依赖浏览器自动携带凭证;

  2. Token 能有效区分合法请求与伪造请求;

  3. 一次性 Token 可彻底阻断重放攻击;

  4. 本实验完整验证了 CSRF 防御的工程可行性。


七、实验总结(教师视角加分点)

本实验结构清晰、逻辑严密、验证充分,

既体现了安全原理,又结合了工程实现,

符合信息安全实验课程的高标准要求。


相关推荐
JustNow_Man1 小时前
“失败后自动拉起修复 Agent”的闭环流水线
前端·人工智能·chrome·python
Dxy12393102161 小时前
HTML中如何写键盘事件
前端·html·计算机外设
霍格沃兹测试学院-小舟畅学1 小时前
接口自动化测试的下一个十年:从脚本到Skills,让AI学会“如何测”
java·前端·人工智能
huangfuyk1 小时前
前端使用Cursor编辑器方面遇到的问题及注意细节
前端·编辑器·ai编程·cursor
ZC跨境爬虫2 小时前
跟着 MDN 学CSS day_31:(精通链接样式,从伪类到导航菜单)
前端·javascript·css·ui·交互
中屹指纹浏览器2 小时前
隐性风控:解析指纹浏览器IP与环境参数冲突BUG及全套适配方案
经验分享·笔记
发现你走远了2 小时前
前端多环境自动化部署实战:GitHub Actions + Azure Blob + Cloudflare
前端·自动化·github
香香爱编程2 小时前
vue3自定义顶部弹窗
前端·javascript·vue.js
其实秋天的枫2 小时前
【26年】考研数学一、二、三历年真题及答案解析PDF电子版(1987-2026年)
经验分享·pdf