应禁用通配符*,改用白名单精确匹配origin;启用credentials时必须指定具体域名且设access-control-allow-credentials:true;options预检需同步校验origin;通过ci/cd检查、安全中间件和上线审计杜绝配置疏漏。

通配符 * 在 CORS 配置中看似方便,实则极易引发高危安全问题——尤其当与凭证(如 Cookie、Authorization)共用时,浏览器会直接拒绝请求;更严重的是,若被恶意站点诱导用户访问,可能造成凭据泄露或敏感数据被读取。避免它,关键不是“禁用”,而是用可控、可验证的方式替代。
只对可信域名精确响应 Origin
后端不能无条件返回 Access-Control-Allow-Origin: *,而应校验请求头中的 Origin 是否在预设白名单内,匹配成功后再写入对应域名:
- Express 示例中,用数组维护合法前端地址:
['https://admin.corp.local', 'https://dashboard.prod.example.com'] - 收到请求时提取
req.headers.origin,严格比对(注意:不忽略协议、端口、斜杠结尾) - 仅当完全匹配才设置
res.setHeader('Access-Control-Allow-Origin', origin),否则不设该头 - 开发环境若需本地调试,可单独加入
http://localhost:3000,但上线前必须移除
启用凭证时彻底禁用通配符
只要接口需要携带 Cookie 或 Token(即前端 fetch 设置了 credentials: 'include'),Access-Control-Allow-Origin 就绝不能为 *,且 Access-Control-Allow-Credentials 必须设为 true:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 这两者必须同时满足:具体域名 + credentials true,缺一不可
- 若允许多个子域(如
app.corp.local和admin.corp.local),可用字符串前缀判断,但需防伪造(例如检查是否以.corp.local结尾且不含非法字符) - 切勿用正则或模糊匹配反射 Origin,这是典型的高危配置,攻击者可构造任意
Origin: https://evil.com并成功绕过
预检请求(OPTIONS)也要受控处理
带自定义头或非简单方法的请求会触发 OPTIONS 预检。如果这个环节没做来源校验,就等于开了个旁路:
- 所有 API 路径都应统一注册 OPTIONS 处理逻辑,返回
204 No Content - 在 OPTIONS 响应中同样校验 Origin,并只返回匹配的
Access-Control-Allow-Origin - 禁止在 OPTIONS 响应中泄露内部信息(如真实服务名、版本号、后端框架)
- 记录异常 OPTIONS 请求(如 Origin 不在白名单、含可疑头字段),纳入日志监控体系
用工具和流程堵住人为疏漏
很多通配符问题是开发阶段图省事、上线时忘记改导致的。靠自觉不如靠机制:
- CI/CD 流程中加入检查项:扫描代码库,禁止出现
origin: '*'或Access-Control-Allow-Origin: '*'字样(测试环境除外) - 使用成熟中间件(如 Express 的
cors包),但务必传入明确的origin数组,而非默认启用通配符 - 上线前执行安全核查清单,重点确认生产配置中未残留
localhost、127.0.0.1或内网 IP 等开发值 - 定期审计响应头,用 curl 或自动化脚本验证关键接口是否返回了预期的
Access-Control-Allow-Origin
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










