React 与 API 配置中的 CSRF 防护
在 React SPA 和 SSR 配置中实现 SameSite Cookie、CSRF 令牌和双重提交 Cookie 模式
React 与 API 配置中的 CSRF 防护 是 CoddyKit 上的免费 React Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 React Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 React Academy 课程共包含 4 节课。
什么是 CSRF
跨站请求伪造(CSRF)是一种攻击:恶意网站诱骗用户的浏览器向您的接口发送经过身份验证的请求。由于浏览器会自动为请求附加 Cookie,服务器无法区分来自您应用的合法请求和来自攻击者网站的伪造请求。
Cookie 为何会导致 CSRF
Cookie 是 CSRF 漏洞的根本原因。当用户登录您的应用后,其会话 Cookie 会存储在浏览器中。当用户访问攻击者的页面时,攻击者可以触发表单提交或向您的接口发送请求,而浏览器会自动附加会话 Cookie,从而使恶意请求通过身份验证。
SameSite Cookie 属性
SameSite Cookie 属性用于告诉浏览器在跨站请求中何时包含 Cookie。它有三个值:Lax(现代浏览器中的默认值——阻止跨站 POST,但允许 GET)、Strict(阻止所有跨站请求,包括 GET 导航)以及 None(允许跨站请求,但要求启用 HTTPS Secure 标志)。
SameSite=Lax 与安全接口
SameSite=Lax 会阻止跨站的 POST、PUT、DELETE 和 PATCH 请求——这些都是用于执行修改操作的方法。如果您的接口只使用 GET 进行读取,并使用 POST 执行所有修改操作,那么在现代浏览器中,SameSite=Lax 就能有效防止 SPA 受到 CSRF 攻击。这是目前大多数应用所依赖的基础防护措施。
双重提交 Cookie 模式
双重提交 Cookie 模式是一种 CSRF 缓解措施:服务器将随机 CSRF 令牌设置在非 HttpOnly Cookie 中。客户端读取该 Cookie 的值,并将其作为自定义请求标头包含在请求中,例如 X-CSRF-Token。服务器会验证标头值是否与 Cookie 值匹配。攻击者无法从其他源读取该 Cookie,因此无法设置正确的标头。
同步令牌模式
同步令牌模式会在服务器上为每个用户会话生成唯一的 CSRF 令牌。对于 HTML 表单,令牌会嵌入隐藏字段中。对于 SPA 接口调用,令牌通过端点或元标签提供,并在自定义标头中发送。服务器会在每个改变状态的请求中验证该令牌。
授权标头中的 JWT:不易受 CSRF 攻击
将 JWT 存储在内存或 localStorage 中,并通过 Authorization: Bearer 标头发送 JWT 的 React SPA,不易受到经典 CSRF 攻击。CSRF 攻击利用的是基于 Cookie 的身份验证;由于 CORS 限制,攻击者的页面无法在跨源请求中设置自定义标头,因此无法伪造 Authorization 标头。
使用自定义请求标头缓解 CSRF
简单的跨源请求(表单 POST、图片加载)不允许使用自定义标头。只有经过 CORS 预检的请求才能包含自定义标头,而预检请求必须获得服务器的明确许可。要求所有修改操作都带有自定义标头(例如 X-Requested-With: XMLHttpRequest)的接口,可以天然防范简单的 CSRF 攻击。
CORS 和 CSRF 不同
CORS 控制哪些来源可以读取跨来源请求的响应。CSRF 关注哪些来源可以发起会改变状态的请求。将 CORS 配置为限制来源并不能防止 CSRF——浏览器仍会发送请求和 Cookie,CORS 只控制 JavaScript 是否能看到响应。CSRF 攻击不需要读取响应。
会话 Cookie 最佳实践
请按以下方式配置会话 Cookie:HttpOnly: true(防止 JavaScript 读取 Cookie,从而阻止基于 XSS 的令牌窃取)、Secure: true(仅通过 HTTPS 发送)、SameSite: Lax 或 Strict(防止 CSRF),以及合适的 Max-Age 或过期时间。这四个属性结合使用,可以显著强化会话管理。
Next.js 应用路由中的 CSRF
Next.js 应用路由使用服务器操作,而服务器操作属于 POST 请求。Next.js 通过检查 Origin 标头是否与主机匹配来实现 CSRF 防护——来自意外来源的请求会被拒绝。这项内置检查与 SameSite=Lax 会话 Cookie 结合使用,可以为基于服务器操作的状态变更提供可靠的 CSRF 防护。
SameSite Cookie 属性
哪一种 SameSite Cookie 值可以阻止跨站 POST 请求,但允许跨站 GET 导航?
课程回顾
CSRF 利用基于 Cookie 的身份验证,诱使浏览器发送经过身份验证的跨站请求。SameSite=Lax 是现代浏览器的基础防御措施。双重提交 Cookie 和同步器令牌模式可以提供额外保护。在授权标头中使用 JWT 的 React SPA 天生能够抵御 CSRF。自定义必需标头和 CORS 预检也可以缓解 CSRF。会话 Cookie 始终应结合使用 HttpOnly + Secure + SameSite。
常见问题解答
「React 与 API 配置中的 CSRF 防护」课时是免费的吗?
是的 — 「React 与 API 配置中的 CSRF 防护」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 React Academy 课程的其余内容,请升级到 CoddyKit PRO。 React Academy 课程共包含 4 节课。
「React 与 API 配置中的 CSRF 防护」这节课中我会学到什么?
在 React SPA 和 SSR 配置中实现 SameSite Cookie、CSRF 令牌和双重提交 Cookie 模式 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 React Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 React Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「React 与 API 配置中的 CSRF 防护」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 React Academy 课中编写并运行代码吗?
能。每节 React Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- React 中的 XSS:dangerouslySetInnerHTML 与第三方脚本
- React 与 API 配置中的 CSRF 防护
- React 应用的内容安全策略
- 机密信息管理与环境变量