API请求的来源域名是否可以伪造?站点如何校验请求发送方域名?
API域名限制的校验方式
这类站点的域名校验基本都是基于HTTP请求头的字段匹配,常见的校验逻辑有两种:
- 校验
Origin请求头
浏览器发起跨域请求时,会自动在请求头中添加Origin字段,值为发起请求的页面所属的源(由协议、域名、端口三部分组成)。服务端会将该字段的值与预设的授权域名白名单比对,匹配通过才会正常处理请求,这也是CORS跨域资源共享机制的核心校验逻辑。 - 校验
Referer请求头
该请求头会记录请求发起的来源页面完整地址,服务端可以提取地址中的域名部分,和白名单做匹配。大部分静态资源的防盗链限制、部分简单的接口域名限制,都是基于这个字段实现的。
来源域名的伪造可行性
来源域名是否能伪造,完全取决于请求发起的环境:
- 浏览器端正常发起的请求
标准浏览器会自动生成Origin和Referer头,前端JavaScript代码没有权限修改这两个头的值,普通用户通过浏览器访问第三方站点发起请求时,这两个字段的内容无法被篡改,基本不存在伪造的可能。 - 非浏览器环境发起的请求
如果你用curl、Postman这类调试工具,或是用后端服务、自定义脚本发起请求,所有HTTP头的内容都可以完全自定义,你可以随意将Origin或Referer的值修改为授权域名列表内的内容,这种场景下来源域名可以被轻易伪造,没有任何校验门槛。
要注意的是,域名限制本身只是面向浏览器场景的防护手段,只能防止普通用户在浏览器中通过非法站点调用你的API,完全无法抵御来自服务端、调试工具的伪造请求,不能作为唯一的API安全防护措施,需要配合接口签名、身份认证、流量风控等手段共同使用。
内容的提问来源于stack exchange,提问作者Raz Buchnik
相关产品推荐
相关产品推荐

