Origin 是什么
Origin 标识请求是从哪个源发起的,由协议、域名与端口三部分组成,不含路径。它是浏览器跨域机制的核心依据:服务端根据它决定是否放行,浏览器根据响应中的授权头决定是否把结果交给脚本。与来源参照字段相比,它更可靠也更容易校验,因为后者可能被隐私策略裁剪或被中间设备省略,而它本身在跨域写请求与预检请求中都会携带。
基本信息
| 名称 | Origin,定义见 Web 来源概念相关规范 |
|---|---|
| 组成 | 协议、域名、端口,不含路径与查询串 |
| 作用 | 跨域请求的来源标识,服务端据此做授权判断 |
| 特殊情况 | 沙箱环境与部分隐私场景下可能取值为空 |
| 校验要求 | 必须按白名单比对,不能原样回显 |
典型使用场景
- 跨域授权:服务端根据它决定是否放行并对响应加上授权头
- 跨站请求防护:校验它是否为可信来源,作为纵深防御的一层
- 统计与审计:记录请求来源分布,识别异常调用
- 灰度与实验:按来源区分不同前端版本的调用
- 第三方接入:核对合作方页面是否按约定来源调用接口
观察跨域请求头
观察跨域请求头
curl -si -X POST https://api.example.com/data -H 'Origin: https://app.example.com' -H 'Content-Type: application/json' -d '{}' # 模拟跨域请求
# 响应里应包含针对该来源的授权头,若缺少则浏览器会拒绝把结果交给脚本
curl -si https://api.example.com/data -H 'Origin: https://evil.example' # 用一个不在白名单里的来源测试,应被拒绝或不下发授权头与相邻字段怎么区分
| 字段 | 可信度与用途 |
|---|---|
| 本字段 | 由浏览器生成,跨域请求必备,服务端可放心作为判断依据 |
| 来源参照字段 | 可能被隐私策略裁剪或省略,只适合做统计不适合做权限判断 |
| 转发来源字段 | 记录链路中的地址,与请求来源无关 |
排查要点
- 跨域授权失败时先确认请求是否真的带上了它,部分场景下取值可能为空
- 白名单要按完整来源比对,协议或端口的细微差异都会导致不匹配
- 不要在原样回显它之后再开启携带凭证,这是最危险的一类配置
空值来源同时出现在沙箱环境与本地文件场景,直接放行空值会引入漏洞。正确做法是明确列出允许的来源,遇到空值一律拒绝并记录日志。
同源的普通读取请求通常不携带它,而跨域的写请求以及所有预检请求都会携带。因此用它做权限判断时,要考虑到「同源请求不带这个字段」这一事实,不能因为它缺失就判定为非法。