0x01 前言

最近在进行CSRF测试的时候遇到了数据包的请求头里有origin与referer,实际测试的时候,我发现只删除referer依然可以正常发起请求,但是删除origin之后就会提示没有权限进行该操作了。于是,我想了解一下这两者的区别。

0x02 referer

两者都表示“来源”。

0x001 referer的形式

referrer:http://www.exampleA.com/index?code=adfafafadt

通常referer会携带url的很多参数信息,这些隐私信息被暴露到外部网站,有可能会产生安全问题。

并且referer存在于所有请求中。

0x002 referer的请求过程

1.在发起请求前,调用window.location获取winodw.location.href获取当前地址栏中的请求地址。

2.将获取到的地址附加到rerferer域中。

0x003 referer的作用

1.防止盗链。

盗链:盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率。受益者不提供资源或提供很少的资源,而真正的服务提供商却得不到任何的收益。【来自百度百科】

2.防止恶意请求。

比如避免CSRF攻击:只允许外部网站访问我的静态资源,不允许访问动态资源。

但是客户端的请求不可靠,很容易被伪造。

0x03 origin

0x001 origin的形式

与referer相似,但origin仅包含

<协议,HOST,PORT>

校验当且仅当三元组的内元素都相等时,才能证明两个域属于同一个域。

相比于referer,origin中不包含参数信息,会更加安全。

并且origin只存在于post请求或CORS请求时。

0x002 origin的由来

origin是由HTML5中跨域操作引入的。

跨域操作过程

1.当请求跨域操作时,浏览器向目标服务器发起了连接请求,并携带origin。

2.当服务器返回时,浏览器检查response中是否包含Access-Control-Allow-Origin字段。

3.如果缺少该字段,浏览器将丢弃(abort)该连接事件。

4.如果存在该字段,浏览器将检查当前请求所在的域是否在该字段允许的域里面。

5.如果是,则继续连接;如果不是,则丢弃该事件。