目标
接口反射任意来源,使恶意站点能在用户浏览器中读取带凭据的响应。本配方只用白名单内的来源并通过回显具体来源来设置 CORS 头,同时处理凭据与 Vary: Origin,再用允许与不允许的来源测试预检,确认不允许的来源拿不到 CORS 头;同时提醒 CORS 本身不是授权控制。
步骤要点
- 仅对白名单内的来源设置 CORS 头并回显该来源。
- 始终发送 Vary: Origin 避免缓存串来源。
- 用允许与不允许的来源测试预检。
- 把合法前端来源纳入白名单并维护。
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 不等于授权。
适用边界
- 不保护服务端到服务端调用。
- 需要维护来源清单。