🌀 鱼油のB10g

✦ 不定期更新技术随想

✦ 分享奇妙发现

📌 近期动态:

探索AI和工具使用...

超硬核科普:CSRF攻击防御指南 🛡️(附实战代码)

0x00 先搞懂啥是CSRF攻击?

CSRF(跨站请求伪造)就像黑客给你下了一个“自动转账咒”!假设你刚登录网银没关页面,这时候点了个“神秘链接”,浏览器就会偷偷用你的登录状态给网银发个转账请求——钱就飞了!
攻击三要素
你已登录(Cookie还在)
网站没有二次验证(比如改密码不用输原密码)
请求参数可预测(比如转账接口是/transfer?to=坏人&money=10000
举个🌰:你在某宝保持登录,点开“免费抽iPhone”链接,结果链接里藏了自动转账代码,钱就没了...(是不是像魔法攻击?)


防御CSRF的五大绝招 🔥

1️⃣ CSRF Token(必杀技)

原理:给每个请求发个“动态密码”,像银行U盾一样!
代码实战(PHP示例):

// 生成随机Token存入Session
session_start();
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));

// 前端表单隐藏字段
echo '<input type="hidden" name="csrf_token" value="'.$_SESSION['csrf_token'].'">';

// 服务端验证
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
    die("CSRF攻击!滚粗!");
}

关键点:

  • Token必须随机切绑定用户Session
  • 每次提交刷新Token防重放攻击
  • 别把Token放Cookie里

2️⃣ SameSite Cookie(浏览器Buff)

原理:让Cookie只认自家门牌号!
设置方法:
Set-Cookie: sessionid=abc123; SameSite=Lax; Secure

三种模式:

  • Strict:跨站绝不带Cookie(连自家链接都要重登录)
  • Lax:只允许安全跳转(比如 a 标签)带Cookie
  • None:关闭防护(必须配合HTTPS) 2025年现状:Chrome默认Lax,攻击成功率暴跌80%!

3️⃣ 双重验证(物理防御)

✅ 验证码:重要操作前弹验证码(比如转账)
✅ 二次密码:改密码必须输原密码
✅ 短信验证:关键操作发短信验证码

适用场景:

  • 金融类敏感操作
  • 管理员权限变更 虽然用户体验降级,但安全性拉满!

4️⃣ Referer/Origin检查(辅助技)

原理:查请求身份证(来自哪个页面)
代码示例:


// 检查Referer是否来自本站
$referer = parse_url($_SERVER['HTTP_REFERER']);
if ($referer['host'] !== 'yoursite.com') {
    die("非法来源!");
}

// 或者检查Origin头(更可靠)
if ($_SERVER['HTTP_ORIGIN'] !== 'https://yoursite.com') {
    die("跨站攻击!");
}

注意:

  • 某些浏览器会隐藏Referer
  • Origin头只存在于CORS请求
  • 可被伪造,不能单独依赖!

5️⃣ HTTP方法限制(防君子)

把敏感操作从GET改成POST!
错误示范:
GET /delete_user?id=1 # 点个链接就能删号!

正确姿势:

<form action="/delete_user" method="POST">
  <input type="hidden" name="id" value="1">
  <button>删号</button>
</form>

虽然POST也能被伪造(比如用隐藏表单),但至少提高了攻击门槛~

最后总结~ 记住:

  • 别用弱随机数生成Token(用SecureRandom)
  • Token要绑定用户Session(别全局统一)
  • 定期做渗透测试!

这次先这样,撂了

posted on 2025-05-07 21:06  鱼油YOU  阅读(69)  评论(0)    收藏  举报