CSRF 防护
在表单中生成并验证 CSRF 令牌,防止伪造请求。
CSRF 防护 是 CoddyKit 上的免费 PHP Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 PHP Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 PHP Academy 课程共包含 4 节课。
什么是 CSRF?
跨站请求伪造(CSRF) 会诱骗经过身份验证的用户提交非预期操作。恶意页面会利用受害者当前的会话,向您的网站发送伪造请求。
CSRF 的工作原理
场景:Alice 已登录 bank.com。她访问了 malicious.com,而该网站包含一个隐藏表单,会使用她的会话 Cookie 自动向 bank.com 提交转账请求。
CSRF 令牌
防御方法是在每个表单中嵌入一个针对每个会话的秘密令牌。服务器会在 POST/PUT/PATCH/DELETE 请求中验证该令牌,而来自其他来源的伪造请求无法读取令牌。
Laravel Blade 中的 @csrf
在每个会修改数据的 HTML 表单中添加 @csrf 指令。
<form method="POST" action="/transfer">
@csrf
<input name="amount" type="number">
<button>Transfer</button>
</form>CSRF 中间件
Laravel 的 VerifyCsrfToken 中间件会在 web 中间件组的所有非 GET 请求中检查 X-CSRF-TOKEN 请求头或 _token 字段。
AJAX 的 CSRF 防护
对于 AJAX 请求,请从 meta 标签中读取令牌,并将其作为请求头发送。
// In the HTML head:
<meta name="csrf-token" content="{{ csrf_token() }}">
// In JavaScript (Axios):
axios.defaults.headers.common["X-CSRF-TOKEN"] =
document.querySelector("meta[name=csrf-token]").content;排除路由
API 路由(使用 Sanctum 令牌)通常会排除在 CSRF 防护之外,因为它们使用基于令牌的身份验证,而不是 Cookie。
<?php
// In VerifyCsrfToken $except:
protected $except = [
"api/*",
"webhooks/*",
];SameSite Cookie 属性
在会话 Cookie 上设置 SameSite=Strict 或 Lax,可以在现代浏览器中提供额外一层 CSRF 防护。
双重提交 Cookie 模式
一种用于 API 的替代 CSRF 防御方法:同时将令牌作为 Cookie 和请求头发送。服务器会验证两者是否匹配,而跨来源请求无法读取 Cookie。
API 上下文中的 CSRF
使用 Bearer 令牌(Sanctum、JWT)进行身份验证的 REST API 不容易受到 CSRF 攻击,因为令牌存储在 localStorage 中(浏览器不会自动发送它)。
测试 CSRF
Laravel 测试辅助工具会自动包含 CSRF 令牌。您也可以测试未受保护的 POST 请求是否会被拒绝。
<?php
// With token:
$this->post("/transfer", ["_token" => csrf_token(), "amount" => 100]);
// Simulating CSRF attack (no token):
$this->withoutMiddleware(VerifyCsrfToken::class)->post("/transfer", [...]);摘要
CSRF 防护要求每个会改变状态的表单都包含隐藏令牌。Laravel 会通过 @csrf 自动处理这一点。对于 AJAX,请将令牌作为 HTTP 请求头添加。使用 Bearer 令牌的 API 路由不受影响。
快速检查
如何为 Laravel Blade 表单添加 CSRF 防护?
常见问题解答
「CSRF 防护」课时是免费的吗?
是的 — 「CSRF 防护」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 PHP Academy 课程的其余内容,请升级到 CoddyKit PRO。 PHP Academy 课程共包含 4 节课。
「CSRF 防护」这节课中我会学到什么?
在表单中生成并验证 CSRF 令牌,防止伪造请求。 你通过在浏览器中直接运行的动手代码来练习 PHP Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 PHP Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 PHP Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「CSRF 防护」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 PHP Academy 课中编写并运行代码吗?
能。每节 PHP Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。