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.如果是,则继续连接;如果不是,则丢弃该事件。