pikachu之CSRF防御:给你的请求加上“网络身份证”

ops/2025/2/22 19:59:04/

CSRF防御:给你的请求加上“网络身份证”

上集回顾

​在上一章节中,我们化身“遥控黑客”,用GET请求和POST表单把CSRF漏洞玩得风生水起,体验了“隔空改签名”等骚操作。今天,我们将从攻击者变身防御者,揭秘如何用Token机制给每个请求颁发“网络身份证”,让伪造请求无所遁形!


作者PS

​这篇内容纯属娱乐~~~毕竟Pikachu这一关卡主要是为了告诉大家关于token对CSRF的防范。


Token机制:请求的“防伪水印”

什么是Token?

​Token就像网络请求的“身份证”——随机生成、独一无二、用过即焚。它的核心作用是告诉服务器:“这个请求真的是我本人发的,不是伪造的!”

Token的三大特性
  1. 随机性:长度至少32位,用加密算法生成(比如random_bytes(32)
  2. 隐蔽性:藏在表单的隐藏字段里,用户看不见摸不着
  3. 一次性:每次请求后立即刷新,绝不给黑客复用机会

Token防御实战:皮卡丘靶场改造计划

步骤一:颁发“身份证”(生成Token)

// 后端代码:生成Token并存到Session
session_start();
if (empty($_SESSION['csrf_token'])) {$_SESSION['csrf_token'] = bin2hex(random_bytes(32)); // 64位十六进制字符串
}

步骤二:随身携带“身份证”(嵌入表单)

<!-- 前端代码:在表单中插入Token -->
<form action="/modify" method="POST"><input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>"><input type="text" name="signature" placeholder="新签名"><button>提交</button>
</form>

步骤三:验明正身(验证Token)

// 后端代码:处理请求前验证Token
session_start();
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {die("CSRF Token验证失败!你不对劲!");
}
// 验证通过后立即销毁旧Token
unset($_SESSION['csrf_token']);

攻击者哭了:破解Token的“不可能任务”

场景一:伪造GET请求

  • 攻击者构造的链接

    http://pikachu/modify?signature=我是憨憨&csrf_token=123456
    
  • 服务器反应

    “Token无效!请求已拦截!”

场景二:伪造POST表单

  • 攻击者的钓鱼页面

    <form action="http://pikachu/transfer" method="POST"><input type="hidden" name="to" value="hacker"><input type="hidden" name="amount" value="10000"><input type="hidden" name="csrf_token" value="猜猜我是谁">
    </form>
    
  • 服务器反应

    “检测到非法Token,已启动自毁程序!”


进阶技巧:让Token“武装到牙齿”

技巧一:双重Token验证(Cookie+表单)

// 生成两个Token:一个放Cookie,一个放表单
setcookie('csrf_cookie', $cookie_token, ['httponly' => true]);
$_SESSION['csrf_form'] = $form_token;// 验证时检查两者是否匹配
if ($_POST['csrf_form'] !== $_SESSION['csrf_form'] || $_COOKIE['csrf_cookie'] !== $cookie_token) {die("双重验证失败!");
}

技巧二:Token绑定用户身份

// 生成Token时混入用户ID
$user_id = $_SESSION['user_id'];
$token = hash_hmac('sha256', random_bytes(32), $user_id);

技巧三:Token自动刷新

// 前端通过Ajax定期获取新Token
setInterval(() => {fetch('/refresh_token').then(res => {document.getElementById('csrf_token').value = res.token;});
}, 300000); // 每5分钟刷新一次

总结

​Token机制就像给每个请求戴上了“防伪手环”,让CSRF攻击者无处下手。通过今天的实验,我们不仅掌握了Token的生成、嵌入和验证全流程,还解锁了双重验证、身份绑定等进阶姿势。

​最后送大家一句安全口诀:“请求不裸奔,Token随身跟,一用一销毁,黑客哭断魂!”


结束——下机——睡觉!!!

剩下的明天再看~~~

我亲爱的床,我来了~~~


http://www.ppmy.cn/ops/160589.html

相关文章

2.6学习

misc buu-[GXYCTF2019]佛系青年 得到一个压缩包&#xff0c;需要密码才能解密010查看一下是真加密还是伪加密。看到是伪加密&#xff0c;将90改为00&#xff0c;得到文件 解压后是一个压缩包和一个文本文件&#xff0c;打开文本文件&#xff0c;看到最下方有一段密文&#x…

论文概览 |《Urban Analytics and City Science》2023.10 Vol.50 Issue.8

本次给大家整理的是《Environment and Planning B: Urban Analytics and City Science》杂志2023年10月第50卷第8期的论文的题目和摘要&#xff0c;一共包括21篇SCI论文&#xff01; 论文1 Advances in geospatial approaches to transport networks and sustainable mobility …

Spring统一功能处理:拦截器、响应与异常的统一管理

目录 一.拦截器 二.统一数据返回格式 三.统一异常处理 一.拦截器 拦截器是Spring框架提供的核功能之&#xff0c;主要来拦截的请求&#xff0c;在指定法前后&#xff0c;根据业务需要执预先设定的代码。 也就是说&#xff0c;允许开发员提前预定义些逻辑&#xff0c;在的请…

Vue.prototype 详解及使用

简介&#xff1a; 在 Vue.js 开发中&#xff0c;Vue.prototype 是一个强大的特性&#xff0c;允许开发者向所有 Vue 实例添加全局方法或属性。 一、Vue.prototype 的作用与原理 原型链继承 Vue 实例通过原型链继承 Vue.prototype 上的属性和方法。当在原型上添加属性或方法后…

[文末数据集]ML.NET库学习010:URL是否具有恶意性分类

文章目录 ML.NET库学习010:URL是否具有恶意性分类项目主要目的和原理项目概述主要功能和步骤总结数据集地址ML.NET库学习010:URL是否具有恶意性分类 项目主要目的和原理 项目主要目的: 本项目的目的是通过分析URL的特征,构建一个机器学习模型来判断给定的URL是否具有恶意…

Python实战:Excel中文转拼音工具开发教程

在日常办公中&#xff0c;我们经常需要处理Excel文件&#xff0c;有时候需要将中文转换为拼音缩写以方便检索和使用。今天我将分享一个使用Python开发的小工具&#xff0c;它可以自动将Excel文件中指定列的中文转换为拼音缩写。 C:\pythoncode\new\ConvertExcelcontentToPinyin…

AB-02 AUTOSAR builder创建工程

AUTOSAR builder创建工程 1. 创建工程2. 创建 ARXML1. 创建工程 在AUTOSAR builder中,通过FileNewAUTOSAR Project,创建一个空的AUTOSAR Project,如下图所示: 通过拖拽的方式,将需要配置EB Tresos工程中的arxml文件加载到AUTOSAR builder工程中,如下图: 或者通过File…

Python网络爬虫技术详解文档

Python网络爬虫技术详解文档 目录 网络爬虫概述爬虫核心技术解析常用Python爬虫库实战案例演示反爬虫机制与应对策略爬虫法律与道德规范高级爬虫技术资源推荐与学习路径1. 网络爬虫概述 1.1 什么是网络爬虫 网络爬虫(Web Crawler)是一种按特定规则自动抓取互联网信息的程序…