CORS设置通配符*真的不安全吗?

Dev · 倩云 阅读 4

我在开发一个前端项目,后端接口为了方便直接设置了 Access-Control-Allow-Origin: *,本地测试没问题,但上线后被安全扫描工具报了“CORS通配符风险”。我查了资料说这样会允许任意网站跨域请求,但我的接口又不需要携带凭证,难道真有风险?

另外,我试过改成具体的域名,但测试环境和生产环境域名不同,维护起来很麻烦。有没有折中的办法?顺便贴一下我用的简单样式:

.api-warning {
  background-color: #fff3cd;
  border: 1px solid #ffeaa7;
  color: #856404;
  padding: 8px 12px;
  border-radius: 4px;
}
我来解答 赞 5 收藏
二维码
手机扫码查看
1 条解答
极客景鑫
这个问题问得挺好,安全扫描工具报的确实没毛病,但具体情况得具体分析。

先说结论:如果你确定接口完全不需要携带Cookie或者其他认证凭证,那 Access-Control-Allow-Origin: * 的风险确实相对有限。但问题在于,你很难保证这个接口永远不需要凭证,业务迭代过程中哪天加了个登录态校验,忘了改CORS配置,那就真出事了。

风险主要体现在几个方面。第一是数据泄露,任意网站都能跨域调用你的API,恶意网站可以诱导用户访问,然后悄悄拉取数据。第二是DNS重绑定攻击,攻击者可以注册个域名,临时解析到你的服务器IP,绕过同源策略。第三就是刚才说的,万一哪天接口加了认证逻辑,配置没跟上,那就是敞开大门让人进。

至于多环境域名的问题,这事儿其实很好解决。后端动态读取请求头里的 Origin 字段,判断一下是不是你允许的域名列表之一,然后动态设置 Access-Control-Allow-Origin 就行了。

给你个Node.js的示例,其他语言思路一样:

const allowedOrigins = [
'https://test.example.com',
'https://www.example.com',
'http://localhost:8080'
];

app.use((req, res, next) => {
const origin = req.headers.origin;
if (allowedOrigins.includes(origin)) {
res.setHeader('Access-Control-Allow-Origin', origin);
}
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
next();
});


这样做的好处是白名单可控,测试环境和生产环境域名都能配进去,维护成本也不高。如果是Nginx反向代理层处理,也可以用 $http_origin 变量配合 map 指令做动态映射,效果一样。

还有个事儿得提醒一下,如果你的API调用需要带Cookie,千万别用 *,浏览器会直接报错。必须指定具体域名,同时设置 Access-Control-Allow-Credentials: true

安全这东西,宁可稍微麻烦点,也别给以后埋坑。
点赞
2026-03-03 00:00