← 中文资源

简体中文版本

使用来源白名单配置 CORS

只允许可信的浏览器来源,正确处理预检请求,避免通配符来源与凭据组合带来的安全风险。

阅读英文原文

CORS 保护的是什么

CORS 告诉浏览器某个跨源页面是否可以读取响应。它不能阻止服务器或命令行客户端调用 API,因此白名单必须与认证和授权配合使用。

const allowed = new Set(process.env.CORS_ORIGINS.split(','));

app.use((req, res, next) => {
  const origin = req.headers.origin;
  if (origin && allowed.has(origin)) {
    res.set('Access-Control-Allow-Origin', origin);
    res.set('Vary', 'Origin');
  }
  next();
});

步骤

  1. 在配置中维护精确来源列表(包含协议、主机和端口),不要写死在代码里。
  2. 仅当请求来源在白名单中时回显 Access-Control-Allow-Origin,并添加 Vary: Origin,避免缓存混淆不同来源的响应。
  3. 在业务逻辑之前处理 OPTIONS 预检,返回 204 与允许的方法、请求头,并设置合理的 Access-Control-Max-Age。
  4. 用允许来源、禁止来源和带凭据的请求分别验证;确认没有盲目回显任意来源。

验证

  • 允许的来源收到精确匹配的 Access-Control-Allow-Origin。
  • 禁止的来源不会收到 CORS 头。
  • 预检返回 204,包含所需的 methods 与 headers。
  • 响应包含 Vary: Origin。
  • 带凭据的请求只在精确来源与正确 Cookie 配置下成功。

常见错误

不回显检查就反射 Origin、允许 null、忘记 Vary、让预检走与正常请求相同的昂贵中间件。永远不要在 Access-Control-Allow-Credentials: true 时使用 *;浏览器会拒绝这种组合,而反射任意来源等同于关闭白名单。