CORS配置安全

wen IT资讯 22

CORS隐患与防护全指南

目录导读

  1. CORS基础与安全威胁

    CORS配置安全

    • 什么是CORS及其工作原理
    • 常见CORS配置错误导致的漏洞
  2. 企业级CORS安全最佳实践

    • 严格源白名单管理
    • 凭据与敏感接口的隔离策略
    • 预检请求的优化与安全控制
  3. CORS与同源策略的博弈

    • 何时必须放宽限制
    • 第三方服务集成的安全底线
  4. 实战问答:六大CORS安全误区

    • 咨询1:如何安全使用Access-Control-Allow-Origin: *
    • 咨询2:配置Access-Control-Allow-Credentials: true有什么风险?
    • 咨询3:为什么预检请求(OPTIONS)也会成为攻击面?
    • 咨询4:浏览器缓存如何影响CORS安全?
    • 咨询5:微服务架构下如何统一管理CORS?
    • 咨询6:CORS和CSRF有何关联?
  5. 自动化检测与持续监控

    • 使用工具扫描CORS漏洞
    • 日志审计与实时告警

CORS基础与安全威胁

CORS(跨域资源共享)是浏览器为了平衡开放性与安全性而设计的机制,当您的Web应用需要从域名A(如app.example.com)向域名B(如api.example.com)发起Ajax请求时,浏览器必须确认服务器允许该跨域行为。错误配置CORS是OWASP Top 10中排名靠前的API安全漏洞

常见CORS配置漏洞

通配符的滥用
许多开发者为了方便,将Access-Control-Allow-Origin设置为,这在包含敏感数据或需要身份验证的接口中极其危险。

Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

这样的组合会允许任意网站读取您的API响应,更可怕的是,攻击者可以通过document.cookie在跨域请求中携带受害者凭据,直接窃取敏感数据。

反射型Origin
动态读取请求头中的Origin值并原样返回:

Access-Control-Allow-Origin: req.headers.origin

攻击者可以伪造任意来源,绕过白名单,实际案例中,某银行API因此泄露了数万用户的交易记录。

信任内网域名
允许*.internal.company.com等域名的CORS访问,但忽视了内网DNS劫持或子域名接管风险。


企业级CORS安全最佳实践

严格源白名单管理

实施原则

  • 只允许明确记录的来源,而非动态匹配
  • 使用精确匹配,避免通配符(除公共资源外)
  • 定期审查白名单中的域名是否过期或被废弃
# Nginx示例
location /api/ {
    add_header Access-Control-Allow-Origin "https://app.example.com" always;
    add_header Access-Control-Allow-Credentials "true" always;
    if ($http_origin ~ "^https://(www|mail)\.example\.com$") {
        add_header Access-Control-Allow-Origin $http_origin;
    }
}

凭据与敏感接口隔离策略

  • 无凭据敏感接口:对不需要cookie/Token的公开接口,可以放宽CORS限制
  • 有凭据接口:必须设置Access-Control-Allow-Origin为具体域名,且不能为
  • 动态授权检查:在服务端额外验证请求来源是否在允许列表中

预检请求安全控制

使用Access-Control-Max-Age控制OPTIONS请求缓存时间:

  • 设置一个合理的有效期(如3600秒),减少OPTIONS请求压力
  • 不要设置过长时间(如86400秒),以便及时更新策略

CORS与同源策略的博弈

何时必须放宽限制?安全底线在哪里?

场景案例

  • 公司有两个业务系统需要互相通信
  • 使用了第三方身份认证服务(如Auth0)
  • 移动端WebView与Native通信

安全最低配置

Access-Control-Allow-Origin: https://specific-trusted-domain.com
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Headers: X-Requested-With, Content-Type, Authorization
Vary: Origin

Vary: Origin的加入让缓存系统能根据请求的不同Origin区分资源,避免CDN错误分发。

*避免Vary: 的原因**:这将导致所有请求都无法缓存,影响性能。


实战问答:六大CORS安全误区

咨询1:如何安全使用Access-Control-Allow-Origin: *

任何包含敏感信息的API都不应使用通配符,只有完全公开的、无需身份验证的静态资源(如字体文件、公开CDN)才可以使用,如果必须使用,请同时确认:

  • 响应中不包含凭据敏感数据
  • 浏览器不会因为与Credentials: true冲突而拒绝请求
  • 使用Access-Control-Allow-Origin: *时,Access-Control-Allow-Credentials不能被设置为true(浏览器会忽略)

咨询2:配置Access-Control-Allow-Credentials: true有什么风险?

:当开启凭据传播后,攻击者在引诱用户访问恶意网站(域名C)时,可以发起附有用户Cookie的跨域请求到您的API域名,即使目标源无法读取响应(因为C不在白名单),但攻击者可能通过控制错误处理(如读取statusstatusText等浏览器允许暴露的信息)来辅助攻击。建议:只有绝对必要(如需要携带session的API)才开启,且对应的Allow-Origin必须指定为单一域名。

咨询3:为什么预检请求(OPTIONS)也会成为攻击面?

:虽然OPTIONS请求仅返回允许的策略,不返回数据,但攻击者可以:

  • 利用Browsers的预检行为进行探测:通过分析OPTIONS响应中的Header,获取服务器支持的HTTP方法,发现隐藏或未授权的接口
  • 发起大量OPTIONS请求进行DDoS:控制重放预检请求消耗服务器资源
  • SSRF绕过:某些系统对OPTIONS方法不做过多的安全校验,导致攻击者可以探测内部服务

防护手段:对OPTIONS请求施加与普通请求同等级的身份校验频率限制,并记录日志。

咨询4:浏览器缓存如何影响CORS安全?

:如果服务器的CORS响应被CDN或浏览器缓存,且未正确设置Vary: Origin,则可能出现:

  • 用户A访问https://trusted.com时的缓存,被用户B访问恶意网站时错误使用
  • 旧的白名单策略因缓存持续生效,导致已废弃的域名仍可跨域

解决:对所有API响应添加Cache-Control: no-store或设置Vary: Origin

咨询5:微服务架构下如何统一管理CORS?

:最佳实践是使用API网关集中处理CORS:

# 网关路由示例
- service: api-service
  routes:
    - path: /api/**
      cors:
        allowedOrigins: ["https://app.example.com", "https://backoffice.example.com"]
        allowedMethods: ["GET", "POST", "PUT", "DELETE"]
        allowedHeaders: ["Content-Type", "Authorization"]
        exposedHeaders: ["X-Custom-Header"]
        maxAge: 3600
        allowCredentials: true

这能确保所有微服务遵循统一策略,避免单个服务配置遗漏。

咨询6:CORS和CSRF有何关联?

:CORS防御了跨域读取,但CSRF攻击的是跨域写操作

  • 攻击者在evil.com构造一个表单POST到bank.com/transfer
  • 浏览器自动携带Cookie,因为同源策略仅限制了某些类型的读取,不阻止表单提交

CORS不能完全替代CSRF防护,即使正确配置了CORS,仍需要反CSRF Token、SameSite Cookie或验证Referer/Origin


自动化检测与持续监控

使用工具扫描CORS漏洞

推荐工具及命令示例

  • CORS扫描器cors-scanner -u https://api.example.com/v1/users
  • Burp Suite插件CORS-Exploit可动态分析
  • OWASP ZAP的主动扫描规则包括CORS配置检查

日常自检流程

curl -H "Origin: https://evil.example.com" \
     -H "Access-Control-Request-Method: GET" \
     -X OPTIONS https://api.example.com/endpoint -v

检查响应中是否出现evil.example.com或以替代的情况。

日志审计与实时告警

  • 记录所有非白名单Origin的CORS请求
  • 对异常IP发起的批量OPTIONS请求触发告警
  • 使用WAF规则拦截Origin: null或空Origin(某些浏览器在file://协议下会发送此值,但正常生产环境很少出现)

CORS配置安全不是“设置一次就忘掉”的事情,每一次业务域的变更、每一个新微服务的上线,都必须同步评估CORS策略,记住三个核心原则:最小权限原则、动态校验与静态约束结合、持续监控与可追溯

通过本文的目录导读和问答,相信您已经建立了扎实的CORS安全知识框架,请把本文的要点融入到您的实际开发与运维流程中,让跨域请求成为安全的便利,而非漏洞的入口。

上一篇安全头部HSTS

下一篇OWASP Top 10

抱歉,评论功能暂时关闭!