Loving Tina? us on GitHub0.0k

文档

学习

v.Latest
Documentation

内容安全策略 (CSP) 配置

在此页面上

概述

内容安全策略 (CSP) 是一种安全标准,有助于防止跨站脚本 (XSS)、点击劫持和其他代码注入攻击。在使用 TinaCMS 时,您需要配置 CSP 头以允许连接到 TinaCMS 服务。

必需的 CSP 指令

TinaCMS 需要以下 CSP 指令才能正常运行:

图像来源

TinaCMS 需要访问其资产交付网络以加载图像:

"img-src 'self' data: assets.tina.io;"

连接来源

TinaCMS 需要连接到多个服务以进行身份验证和内容交付:

"connect-src 'self' identity.tinajs.io content.tinajs.io assets.tinajs.io;"
  • identity.tinajs.io - 身份验证和身份服务
  • content.tinajs.io - 内容 API 和数据层
  • assets.tinajs.io - 资产管理和交付

实现示例

Next.js 配置

应用路由器 (Next.js 13+)

next.config.js 中添加 CSP 头:

const baseCsp = [
"default-src 'self';",
"img-src 'self' data: assets.tina.io;",
"font-src 'self' data: fonts.gstatic.com;",
"object-src 'none';",
"frame-src 'none';",
"worker-src 'self' blob:;",
"frame-ancestors 'none';",
"base-uri 'self';",
"connect-src 'self' identity.tinajs.io content.tinajs.io assets.tinajs.io;"
];
/** @type {import('next').NextConfig} */
const nextConfig = {
async headers() {
return [
{
source: '/:path*',
headers: [
{
key: 'Content-Security-Policy',
value: baseCsp.join(' '),
},
],
},
];
},
};
module.exports = nextConfig;
页面路由器

对于页面路由器,您也可以在 next.config.js 中使用上述相同的方法配置 CSP。

或者,在中间件中设置 CSP 头:

// middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
export function middleware(request: NextRequest) {
const response = NextResponse.next();
const csp = [
"default-src 'self'",
"img-src 'self' data: assets.tina.io",
"connect-src 'self' identity.tinajs.io content.tinajs.io assets.tinajs.io",
// ... 其他指令
].join('; ');
response.headers.set('Content-Security-Policy', csp);
return response;
}

Netlify 配置

netlify.toml 中添加 CSP 头:

[[headers]]
for = "/*"
[headers.values]
Content-Security-Policy = "default-src 'self'; img-src 'self' data: assets.tina.io; connect-src 'self' identity.tinajs.io content.tinajs.io assets.tinajs.io; font-src 'self' data: fonts.gstatic.com; object-src 'none'; frame-src 'none'; worker-src 'self' blob:; frame-ancestors 'none'; base-uri 'self';"

Vercel 配置

vercel.json 中添加头:

{
"headers": [
{
"source": "/(.*)",
"headers": [
{
"key": "Content-Security-Policy",
"value": "default-src 'self'; img-src 'self' data: assets.tina.io; connect-src 'self' identity.tinajs.io content.tinajs.io assets.tinajs.io; font-src 'self' data: fonts.gstatic.com; object-src 'none'; frame-src 'none'; worker-src 'self' blob:; frame-ancestors 'none'; base-uri 'self';"
}
]
}
]
}

Apache 配置

添加到您的 .htaccess 文件:

<IfModule mod_headers.c>
Header set Content-Security-Policy "default-src 'self'; img-src 'self' data: assets.tina.io; connect-src 'self' identity.tinajs.io content.tinajs.io assets.tinajs.io; font-src 'self' data: fonts.gstatic.com; object-src 'none'; frame-src 'none'; worker-src 'self' blob:; frame-ancestors 'none'; base-uri 'self';"
</IfModule>

Nginx 配置

添加到您的 nginx 配置:

add_header Content-Security-Policy "default-src 'self'; img-src 'self' data: assets.tina.io; connect-src 'self' identity.tinajs.io content.tinajs.io assets.tinajs.io; font-src 'self' data: fonts.gstatic.com; object-src 'none'; frame-src 'none'; worker-src 'self' blob:; frame-ancestors 'none'; base-uri 'self';" always;

自托管注意事项

如果您使用 自托管 TinaCMS 设置,您可能需要调整这些 CSP 指令:

  • 将 TinaCloud 域替换为您自己的后端 URL
  • 确保 connect-src 包含您的内容 API 端点
  • 将任何自定义媒体存储域添加到 img-src

自托管示例:

const baseCsp = [
"default-src 'self';",
"img-src 'self' data: your-media-storage.example.com;",
"connect-src 'self' your-backend.example.com;",
// ... 其他指令
];

故障排除

浏览器控制台中的 CSP 违规

如果您在浏览器控制台中看到 CSP 违规错误:

  1. 检查错误消息以识别被阻止的资源
  2. 将适当的域添加到相关的 CSP 指令
  3. 彻底测试以确保 TinaCMS 功能正常

常见违规:

  • 阻止的图片加载:将域添加到 img-src
  • 阻止的 API 调用:将域添加到 connect-src
  • 阻止的内联样式:您可能需要为某些 TinaCMS 功能添加 style-src 'unsafe-inline'

TinaCMS 编辑器未加载

如果 TinaCMS 编辑器无法加载:

  1. 验证所有必需的域是否包含在 connect-src
  2. 检查浏览器控制台中的 CSP 违规
  3. 确保 frame-src 允许 TinaCMS 管理界面(如果使用 iframe 模式)

使用 GitHub 进行身份验证时遇到问题?可能是您的 CSP 配置问题!

查看 这个 GitHub 问题及其解决方法

测试 CSP 配置

使用浏览器开发者工具验证您的 CSP 配置:

  1. 打开开发者工具 → 控制台
  2. 查找 CSP 违规警告
  3. 点击违规以查看哪些资源被阻止
  4. 相应地更新您的 CSP

您还可以使用在线工具如 CSP Evaluator 来验证您的策略。

其他资源

最佳实践

  1. 从严格开始,然后放宽:从严格的 CSP 开始,仅在需要时添加例外
  2. 使用仅报告模式:在强制执行之前使用 Content-Security-Policy-Report-Only 测试 CSP 更改
  3. 定期审计:随着应用程序的发展,审查和更新您的 CSP
  4. 记录例外:记录为什么特定域被列入白名单
  5. 环境特定策略:考虑为开发和生产设置不同的 CSP 规则