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

news/2025/2/23 0:48:52

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.niftyadmin.cn/n/5862883.html

相关文章

MySQL八股学习笔记

文章目录 一、MySQL结构1.宏观结构1.1.Server层1.2.存储引擎层 2.建立链接-连接器3.查询缓存4.解析SQL-解析器&#xff08;1&#xff09;词法分析&#xff08;2&#xff09;语法分析 5.执行SQL5.1.预处理器 prepare5.2.优化器 optimize5.3.执行器 execute&#xff08;1&#xf…

Day15-后端Web实战-登录认证——会话技术JWT令牌过滤器拦截器

目录 登录认证1. 登录功能1.1 需求1.2 接口文档1.3 思路分析1.4 功能开发1.5 测试 2. 登录校验2.1 问题分析2.2 会话技术2.2.1 会话技术介绍2.2.2 会话跟踪方案2.2.2.1 方案一 - Cookie2.2.2.2 方案二 - Session2.2.2.3 方案三 - 令牌技术 2.3 JWT令牌2.3.1 介绍2.3.2 生成和校…

WARNING: pip is configured with locations that require TLS/SSL

一、报错 WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available. 二、故障排查 1、检查Python3环境中的SSL支持: 打开终端或命令提示符,进入你的Python环境目录。 运行以下命令来查看可用的SSL版本: [r…

开源且免费的CMS系统有哪几个可以放心用?

既开源又免费的两全其美的CMS不多见&#xff0c;不过总会存在一些个例&#xff0c;给用户们带来更具有建设性的选择&#xff0c;以下是一些开源免费且值得信赖的CMS系统&#xff0c;可以根据你的需求选择合适的平台&#xff1a; 1、WordPress ▷ 特点&#xff1a;全球最流行的…

解决MySQL错误:You can‘t specify target table ‘xxx‘ for update in FROM clause

目录 错误复现场景原因分析解决方案方法1&#xff1a;使用派生表&#xff08;推荐&#xff09;方法2&#xff1a;改用JOIN操作方法3&#xff1a;使用临时表 总结 在编写MySQL的UPDATE或DELETE语句时&#xff0c;如果子查询中直接引用了要操作的目标表&#xff0c;可能会遇到一个…

【2024 CSDN博客之星】大学四年,我如何在CSDN实现学业与事业的“双逆袭”?

前言&#xff1a; Hello大家好&#xff0c;我是Dream。不知不觉2024年已经过去&#xff0c;自己也马上迈入23岁&#xff0c;感慨时间飞快&#xff0c;从19岁刚入大学加入CSDN&#xff0c;到现在大学毕业已经整整四年了。CSDN陪伴我走过了最青涩的四年大学时光&#xff0c;在这里…

本地部署 DeepSeek + Dify,构建自己的AI能力

概述 DeepSeek 是一款开创性的开源大语言模型,凭借其先进的算法架构和反思链能力,为 AI 对话交互带来了革新性的体验。通过私有化部署,你可以充分掌控数据安全和使用安全。你还可以灵活调整部署方案,并实现便捷的自定义系统。 Dify 作为同样开源的 AI 应用开发平台,提供完…

【Kafka】Kafka高性能解读

Kafka 的高性能源于其分布式架构设计、高效数据存储和优化算法。以下是 Kafka 高性能的核心原理及其实现细节&#xff1a; 1. 分布式架构设计 1.1 分区&#xff08;Partitioning&#xff09; 并行处理&#xff1a;将 Topic 划分为多个 Partition&#xff0c;每个 Partition 独…