[HOME] 首页 [DASH] 仪表盘 [ATK] 攻击模拟 [RES] 资源库 [DOC] 术语表 [TEST] 安全测验 [MSG] 留言板 [ADMIN] 管理后台 [USER] 登录 / 注册

CSRF 攻击:利用信任骗取用户操作的隐形威胁

什么是 CSRF?


CSRF(Cross-Site Request Forgery,跨站请求伪造)利用用户已登录的身份,在用户不知情的情况下,诱导其浏览器向目标网站发起恶意请求。


与 XSS 的区别:XSS 在受害者浏览器执行攻击者代码;CSRF 在受害者浏览器发送对目标网站的正常请求(攻击代码在第三方网站)。


攻击原理


1. 用户登录银行网站 bank.com,浏览器保存 Session Cookie
2. 用户访问攻击者控制的网站 evil.com
3. evil.com 的页面自动提交一个向 bank.com 转账的表单
4. 浏览器自动携带 bank.com 的 Cookie 请求
5. 银行验证 Cookie 后,执行转账操作


攻击示例


银行转账场景


正常转账请求:


<form action="https://bank.com/transfer" method="POST">
<input type="hidden" name="to" value="attacker">
<input type="hidden" name="amount" value="10000">
<input type="submit" value="查看详情">
</form>

攻击者在钓鱼页面中嵌入此表单,设置 display:none,用 JavaScript 自动提交:


<body onload="document.forms[0].submit()">
<form action="https://bank.com/transfer" method="POST">
<input type="hidden" name="to" value="attacker">
<input type="hidden" name="amount" value="100000">
</form>
</body>

防御措施


1. CSRF Token(最常用)


服务端为每个会话生成随机 Token,表单中携带,提交时验证:


// 生成
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));


// 验证
if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'] ?? '')) {
die('CSRF 验证失败!');
}


<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">

2. SameSite Cookie


设置 Cookie 的 SameSite 属性:


setcookie('session_id', $token, [
'samesite' => 'Strict',
'httponly' => true,
'secure' => true,
]);

3. 双重提交验证


将 Token 同时放在 Cookie 和 Header 中,服务端对比一致性。

MSG 评论 (0)

暂无评论,来发表第一条吧