这个 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 安全错误。

Back to Blog

相关文章

阅读更多 »