公共REST API默认启用CORS是否可行?存在哪些风险?
配置这些CORS头的弊端与风险
首先得指出你收到的配置本身有个致命错误:Access-Control-Allow-Credentials的有效值只有true或false,写*是无效的,浏览器会直接忽略这个头,导致带基础认证凭证的请求依然失败,这个配置根本解决不了客户的问题。
除此之外,默认开启这类配置存在极大的安全风险:
- 完全架空基础认证保护:
Access-Control-Allow-Origin: *意味着任何网站都能在浏览器端调用你的API。结合基础认证来看,用户的账号密码(存在Authorization头里)会被浏览器自动携带到请求中,恶意网站只要诱导用户访问,就能发起请求窃取你的API返回的数据,甚至通过PUT/DELETE接口修改、删除数据——等于你的基础认证完全失去了作用。 - 过度开放操作权限:开放
POST, GET, PUT, OPTIONS, DELETE所有HTTP方法,等于给了外部站点完整的读写删权限,一旦被恶意利用,数据泄露或被篡改的风险极高。 - 凭证滥用风险:允许
Authorization头跨域携带,再配合通配符源,恶意站点可以利用用户已有的认证状态(比如用户刚在合法页面登录过),构造请求发起未授权的操作。
公共API的默认配置原则
公共API绝对不应该默认开启这类宽松配置,正确的做法是:
- 严格限制允许的源:不要用
*,而是将Access-Control-Allow-Origin设为客户的具体域名(比如https://client-website.com);如果有多个客户,可维护一个域名白名单,动态匹配请求源后返回对应的值。 - 精准开放HTTP方法:只开放客户实际需要的方法,比如客户只需要获取数据就只允许
GET,需要提交数据就加POST,关闭不需要的PUT/DELETE。 - 正确配置凭证允许:将
Access-Control-Allow-Credentials设为true(必须和指定的源搭配,不能用*),这样客户的浏览器才能正常携带基础认证凭证。 - 按需设置允许的头:只保留客户实际需要的请求头,比如
Content-Type和Authorization,避免不必要的头被滥用。
内容的提问来源于stack exchange,提问作者Marcel
相关产品推荐
相关产品推荐

