做前端联调时,跨域报错几乎人人都遇到。控制台一片红字,进度又赶,最常见的处理是让后端把允许来源写成星号,报错立刻消失。这个改动能用,但它也拆掉了一个限制,而那个限制本来在保护数据。
同源策略挡的是什么
浏览器规定,一个页面只能自由读取同源地址的数据。域名、协议、端口任意一项不同,就算跨域,读取要经过服务端明确同意。这条规则的目的很简单:你登录过的站点,不能让另一个站点的脚本替你去读数据。
放开来源,等于放开读取
服务端返回允许跨域的头,浏览器就会把响应交给发起请求的页面。如果允许来源写成星号,任何网站都能读这个接口的返回;如果同时还允许携带凭证,别处的页面就能带着用户的登录态取数据。这类配置在代码里只占一行,在安全上却是个大洞。
常见的一行配置
需要携带 Cookie 或令牌时,允许来源不能是星号,服务端通常把请求来源原样回写。这种写法如果没做白名单校验,等于放行所有来源。正确做法是维护允许列表,按环境区分,来源不在列表内就不返回跨域头。
只放开真正需要的部分
允许的方法和请求头,按接口实际需要给,不要整站一把梭。预检结果的缓存时间可以设,但别过长,接口调整后旧规则会一直生效。需要暴露给前端的响应头单独声明,用不到的不要顺手放开。
字体和图片是另一条线
网页字体基本都要求跨域头,否则字体加载失败,页面退回系统字体,排版全乱。图片要在画布里处理,也需要服务端允许跨域,并在标签上标明跨域属性,两者缺一不可。只配头没加属性,图片能显示但画布读不到像素,报的错看起来莫名其妙。
排查时容易看错的地方
一是中间还有代理或加速节点,把源站的响应头覆盖了;二是错误响应也带了缓存,改完刷新还是旧结果;三是开发与正式环境配置不一致,本地正常线上报错。直接看预检请求的实际响应头,比在业务代码里找原因快。
别把跨域当成上线后才管的事
接口在设计阶段就该明确哪些是公开数据、哪些需要登录、哪些只允许自家页面调用。三类分开,跨域配置自然收得住。等上线后被扫描工具报出来再改,要牵动多个调用方。
小结
跨域不是要关掉的功能,而是需要精确配置的边界。来源用白名单,方法和请求头按需放开,凭证与星号不要同时出现。冉冉科技在官网与业务系统对接中,会把跨域规则纳入上线前的安全检查。
关于冉冉科技
江苏冉冉信息科技有限公司(品牌“冉冉科技”)成立于2017年,位于江苏省常州市新北区,是一家从事互联网信息服务、电子商务应用与企业应用系统开发的技术服务企业。公司业务涵盖网站建设、网页设计、SEO优化、竞价包年、域名注册、虚拟主机、企业邮箱、整合营销及企业形象策划等,以“只做有效果的网络营销”为服务主张,累计完成三千余起网站建设与服务。

冉冉科技

商务咨询