CSRF防御:给你的请求加上“网络身份证”
上集回顾
在上一章节中,我们化身“遥控黑客”,用GET请求和POST表单把CSRF漏洞玩得风生水起,体验了“隔空改签名”等骚操作。今天,我们将从攻击者变身防御者,揭秘如何用Token机制给每个请求颁发“网络身份证”,让伪造请求无所遁形!
作者PS
这篇内容纯属娱乐~~~毕竟Pikachu这一关卡主要是为了告诉大家关于token对CSRF的防范。
Token机制:请求的“防伪水印”
什么是Token?
Token就像网络请求的“身份证”——随机生成、独一无二、用过即焚。它的核心作用是告诉服务器:“这个请求真的是我本人发的,不是伪造的!”
Token的三大特性
- 随机性:长度至少32位,用加密算法生成(比如
random_bytes(32)
) - 隐蔽性:藏在表单的隐藏字段里,用户看不见摸不着
- 一次性:每次请求后立即刷新,绝不给黑客复用机会
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随身跟,一用一销毁,黑客哭断魂!”