内容安全策略 (CSP) 是一种安全标准,有助于防止跨站脚本 (XSS)、点击劫持和其他代码注入攻击。在使用 TinaCMS 时,您需要配置 CSP 头以允许连接到 TinaCMS 服务。
TinaCMS 需要以下 CSP 指令才能正常运行:
TinaCMS 需要访问其资产交付网络以加载图像:
"img-src 'self' data: assets.tina.io;"
TinaCMS 需要连接到多个服务以进行身份验证和内容交付:
"connect-src 'self' identity.tinajs.io content.tinajs.io assets.tinajs.io;"
在 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.tsimport { 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.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.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';"}]}]}
添加到您的 .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 配置:
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 指令:
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 违规错误:
常见违规:
img-srcconnect-srcstyle-src 'unsafe-inline'如果 TinaCMS 编辑器无法加载:
connect-src 中frame-src 允许 TinaCMS 管理界面(如果使用 iframe 模式)使用 GitHub 进行身份验证时遇到问题?可能是您的 CSP 配置问题!
使用浏览器开发者工具验证您的 CSP 配置:
您还可以使用在线工具如 CSP Evaluator 来验证您的策略。
Content-Security-Policy-Report-Only 测试 CSP 更改