这个 CORS 错误暴露了你的 API(我到处都见到)
发布: (2025年12月27日 GMT+8 17:40)
2 min read
原文: Dev.to
Source: Dev.to
Problem
在许多 Cloudflare Workers(以及其他无服务器函数)中常见的模式是:
headers.set('Access-Control-Allow-Origin', '*');
headers.set('Access-Control-Allow-Credentials', 'true');
乍一看这似乎无害,但它会导致严重的安全漏洞。
Why it’s a security hole
当 Access-Control-Allow-Origin 被设置为 * 且 Access-Control-Allow-Credentials 被设置为 true 时,你实际上在告诉浏览器:
“允许任何网站对我的 API 发起带身份验证的请求。”
后果
- 恶意站点可以读取用户数据。
- 它们可以代表已登录的用户发起请求。
- 会话令牌和 Cookie 可能被窃取。
Fixes
Option 1: Use specific origins
const allowedOrigins = [
'https://yourdomain.com',
'https://app.yourdomain.com'
];
const origin = request.headers.get('Origin');
if (allowedOrigins.includes(origin)) {
headers.set('Access-Control-Allow-Origin', origin);
headers.set('Access-Control-Allow-Credentials', 'true');
}
只有列出的来源被允许发送带凭证的请求。
Option 2: Omit credentials
如果你的 API 不需要 Cookie 或其他身份验证头部,完全去掉凭证头:
headers.set('Access-Control-Allow-Origin', '*');
// No Access-Control-Allow-Credentials header
Bottom line
切勿在 Access-Control-Allow-Origin 使用通配符 (*) 的同时使用 Access-Control-Allow-Credentials。请选择一种做法——特定来源 或 不使用凭证。这一简单的更改即可防止广泛出现的 CORS 安全错误。