什么是 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)
暂无评论,来发表第一条吧