CORS设置通配符*真的不安全吗?
我在开发一个前端项目,后端接口为了方便直接设置了 Access-Control-Allow-Origin: *,本地测试没问题,但上线后被安全扫描工具报了“CORS通配符风险”。我查了资料说这样会允许任意网站跨域请求,但我的接口又不需要携带凭证,难道真有风险?
另外,我试过改成具体的域名,但测试环境和生产环境域名不同,维护起来很麻烦。有没有折中的办法?顺便贴一下我用的简单样式:
.api-warning {
background-color: #fff3cd;
border: 1px solid #ffeaa7;
color: #856404;
padding: 8px 12px;
border-radius: 4px;
}
先说结论:如果你确定接口完全不需要携带Cookie或者其他认证凭证,那
Access-Control-Allow-Origin: *的风险确实相对有限。但问题在于,你很难保证这个接口永远不需要凭证,业务迭代过程中哪天加了个登录态校验,忘了改CORS配置,那就真出事了。风险主要体现在几个方面。第一是数据泄露,任意网站都能跨域调用你的API,恶意网站可以诱导用户访问,然后悄悄拉取数据。第二是DNS重绑定攻击,攻击者可以注册个域名,临时解析到你的服务器IP,绕过同源策略。第三就是刚才说的,万一哪天接口加了认证逻辑,配置没跟上,那就是敞开大门让人进。
至于多环境域名的问题,这事儿其实很好解决。后端动态读取请求头里的
Origin字段,判断一下是不是你允许的域名列表之一,然后动态设置Access-Control-Allow-Origin就行了。给你个Node.js的示例,其他语言思路一样:
这样做的好处是白名单可控,测试环境和生产环境域名都能配进去,维护成本也不高。如果是Nginx反向代理层处理,也可以用
$http_origin变量配合map指令做动态映射,效果一样。还有个事儿得提醒一下,如果你的API调用需要带Cookie,千万别用
*,浏览器会直接报错。必须指定具体域名,同时设置Access-Control-Allow-Credentials: true。安全这东西,宁可稍微麻烦点,也别给以后埋坑。