首页/安全/漏洞与攻击面速查/CORS 跨域配置错误
Web 漏洞原理与防护55 条

CORS 跨域配置错误

CORS 把 Access-Control-Allow-Origin 反射为任意来源并允许携带凭据时,任意站点都能读取用户数据;防护是来源白名单精确匹配,避免通配与反射。

漏洞与攻击面速查安全更新于 2026-10-13

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 是最危险的组合,等价于对所有网站开放凭据访问,必须优先整改。

易错点

  • 正则未锚定结尾:https://example.com.evil.cn 之类的域名会被前缀匹配放行
  • 把请求来源原样反射进 Allow-Origin 并同时允许凭据,等于向所有站点开放登录态数据
  • 只处理简单请求不处理预检 OPTIONS,跨域调用时好时坏,排查方向容易被带偏
  • 把 null 来源加入白名单:沙箱 iframe 与本地文件场景可以借此绕过限制
  • 在 CDN 缓存中忽略了 Origin 维度,导致 A 站点的跨域响应被缓存后返回给 B 站点

数据来源与参考

  • MDN CORS 文档
  • OWASP CORS 配置错误说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌