0Pricing
React Academy · 课时

React 应用的内容安全策略

配置严格的 CSP 标头,阻止内联脚本和未经授权的外部资源在 React 应用中加载

React 应用的内容安全策略 是 CoddyKit 上的免费 React Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 React Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 React Academy 课程共包含 4 节课。

什么是内容安全策略

内容安全策略(CSP)是一种 HTTP 响应标头,用于告知浏览器哪些内容来源是可信的。通过明确声明允许加载哪些脚本、样式、图像和字体,CSP 可以阻止注入的恶意内容执行——即使 XSS 漏洞允许攻击者向页面注入 HTML。

default-src 和 script-src

default-src 'self' 设置基线:所有资源类型(脚本、样式、图像、字体和框架)只能从同一来源加载。script-src 'self' 将脚本加载范围缩小到同一来源,从而阻止来自外部 CDN 的脚本,除非明确列出这些来源。这两个指令共同构成限制性 CSP 的基础。

为什么阻止 eval 很重要

eval() 会在运行时将字符串转换为可执行代码,而这正是 XSS 载荷所需要的功能。使用 script-src 'self'(不包含 'unsafe-eval')的 CSP 会阻止 eval() 以及 new Function() 和 setTimeout(string) 等相关函数。这样可以消除一大类 XSS 载荷的执行途径。

使用 strict-dynamic 处理脚本链

'strict-dynamic' 位于 script-src 中时,会将信任授予由已有可信脚本加载的脚本。这支持打包工具使用的动态脚本加载模式,无需将每个 CDN 地址都列入允许列表。可信脚本可以加载其他脚本,而这些脚本会继承信任。

基于哈希的 CSP 内联脚本

如果应用需要某个特定的内联脚本(例如分析工具初始化代码片段),您可以计算其 SHA-256 哈希值,并将 'sha256-base64hash' 添加到 script-src 中。只有与该精确哈希值匹配的脚本才允许以内联方式执行。攻击者注入的脚本会具有不同的哈希值,因此会被阻止。

基于随机数的 CSP

随机数是服务器为每个请求生成的密码学随机值。服务器会将该随机数同时添加到脚本标签(<script nonce="abc123">)和 CSP 标头(script-src 'nonce-abc123')中。只有带有正确随机数的脚本才能执行。攻击者无法预测该随机数,因此注入的脚本无法使用它。

CSP 报告

CSP 支持通过 report-uri /csp-violation-endpoint 或较新的 report-to 指令报告违规情况。当浏览器因 CSP 阻止某个资源时,会向端点发送 JSON 报告。监控这些报告有助于您识别合法的配置问题和正在进行的攻击尝试。

在 Next.js 中实现 CSP

在 Next.js 中,请在中间件中添加 CSP 标头:创建 middleware.ts,生成随机数,设置 Content-Security-Policy 标头,并通过响应标头将随机数传递给页面。页面布局会从标头中读取随机数,并将其应用于所有内联脚本和样式标签。

在不阻止内容的情况下测试 CSP

Content-Security-Policy-Report-Only 是测试模式:浏览器不会执行任何阻止操作,但会针对所有本应被阻止的内容发送违规报告。请先以仅报告模式部署并修复所有违规,然后切换到强制执行的 Content-Security-Policy 标头,以免破坏应用。

Chrome DevTools 控制台中的违规信息

当 CSP 阻止某个资源时,Chrome DevTools 控制台会显示红色错误消息,指出被阻止的地址和违反的指令。这些消息在开发和测试期间非常有价值。每项违规都必须通过修正规则、将资源移到允许的来源,或使用随机数/哈希值来解决。

React SPA 的实用 CSP 配置

一种实用的 React SPA CSP 配置是:default-src 'self'; script-src 'self' 'strict-dynamic' 'nonce-NONCE'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; connect-src 'self' https://api.yourdomain.com; frame-ancestors 'none'。frame-ancestors 'none' 还可以通过阻止应用嵌入框架来防止点击劫持。

CSP 中的 script-src self

内容安全策略中的 script-src 'self' 可以阻止什么?

课程回顾

CSP 是用于声明可信内容来源的 HTTP 标头。default-src 'self' 和 script-src 'self' 会阻止外部脚本和 eval。内联脚本可以通过哈希值或随机数放行。'strict-dynamic' 支持动态脚本加载。请使用 Content-Security-Policy-Report-Only 在强制执行前进行测试。Next.js 通过中间件实现 CSP。DevTools 控制台会实时显示违规信息。

常见问题解答

「React 应用的内容安全策略」课时是免费的吗?

是的 — 「React 应用的内容安全策略」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 React Academy 课程的其余内容,请升级到 CoddyKit PRO。 React Academy 课程共包含 4 节课。

「React 应用的内容安全策略」这节课中我会学到什么?

配置严格的 CSP 标头,阻止内联脚本和未经授权的外部资源在 React 应用中加载 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 React Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 React Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「React 应用的内容安全策略」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 React Academy 课中编写并运行代码吗?

能。每节 React Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. React 中的 XSS:dangerouslySetInnerHTML 与第三方脚本
  2. React 与 API 配置中的 CSRF 防护
  3. React 应用的内容安全策略
  4. 机密信息管理与环境变量
← 返回 React Academy