CORS 配置错误是什么
CORS(跨域资源共享)本意是让浏览器在受控条件下允许跨域读取响应。配置错误有两种典型形态:一是把 Access-Control-Allow-Origin 反射为请求来源,二是白名单正则写得过于宽松。当同时允许携带凭据(Allow-Credentials: true)时,任意站点都能在受害者浏览器里读取其登录态下的数据,等同于数据被公开。
基本信息
| 涉及头部 | Access-Control-Allow-Origin / -Credentials / -Methods / -Headers |
|---|---|
| 错误形态 | 通配来源、来源反射、正则未锚定、白名单含 null |
| 前提条件 | 浏览器发起跨域请求并携带 Cookie 或 Authorization |
| 正确做法 | 来源精确白名单匹配,敏感接口保持同源或经后端代理 |
错误与正确对比
错误与正确对比
# 错误:通配来源 + 携带凭据(浏览器同时拒绝,配置本身也危险)
add_header Access-Control-Allow-Origin "*";
add_header Access-Control-Allow-Credentials "true";
# 正确:白名单精确匹配,未命中则不下发该头
set $cors "";
if ($http_origin ~ ^https://(app|admin)\.example\.com$) { set $cors $http_origin; }
add_header Access-Control-Allow-Origin $cors always;
if ($cors = "") { add_header Vary Origin always; } # 避免 CDN 缓存串源要点
要点
正则匹配要锚定结尾,避免 evil-example.com 类域名匹配成功
携带凭据场景不允许通配来源(浏览器会直接拒绝该响应)
预检请求(OPTIONS)的响应头同样按白名单下发,不要直接返回 200 空响应
敏感接口优先同源或经后端代理,不要为方便放开跨域
代理层与 CDN 缓存要按 Origin 区分缓存键典型使用场景
- 前后端分离项目上线检查:确认生产环境未沿用开发期的通配配置
- 多域名集团站点:子域间互访时用精确白名单而不是正则前缀
- 第三方接入:只为合作方域名开白名单,并限定方法与头部
- 渗透测试确认:判断反射型 CORS 是否真能读取数据(需要在浏览器里带凭据复现)
- API 网关治理:把 CORS 统一到网关,避免各服务各写一份
CORS 是浏览器侧的授权机制:配置错误不会影响非浏览器请求(脚本、爬虫直接用工具请求即可),它的实际危害是允许任意站点读取携带会话的数据。
来源反射(直接把请求里的 Origin 原样写回)配合 Allow-Credentials 是最危险的组合,等价于对所有网站开放凭据访问,必须优先整改。