← 中文资源

简体中文版本

把 CORS 限制为来源白名单

用严格的来源白名单取代通配符 CORS,并安全处理凭据与预检请求。

阅读英文原文

目标

接口反射任意来源,使恶意站点能在用户浏览器中读取带凭据的响应。本配方只用白名单内的来源并通过回显具体来源来设置 CORS 头,同时处理凭据与 Vary: Origin,再用允许与不允许的来源测试预检,确认不允许的来源拿不到 CORS 头;同时提醒 CORS 本身不是授权控制。

步骤要点

  1. 仅对白名单内的来源设置 CORS 头并回显该来源。
  2. 始终发送 Vary: Origin 避免缓存串来源。
  3. 用允许与不允许的来源测试预检。
  4. 把合法前端来源纳入白名单并维护。
const allowed = new Set(['https://app.example.com', 'https://admin.example.com']);
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');
    res.set('Access-Control-Allow-Credentials', 'true');
  }
  next();
});

排错提示

  • 凭据与通配符来源不能共存。
  • 缺少 Vary 会让缓存复用错误来源。
  • CORS 不等于授权。

适用边界

  • 不保护服务端到服务端调用。
  • 需要维护来源清单。