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.如果是,則繼續連接;如果不是,則丟棄該事件。
