您好,登錄后才能下訂單哦!
這篇文章給大家介紹host、referer和origin的區(qū)別有哪些,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
host比較容易理解,來看下MDN網(wǎng)站給的介紹:
Host 請(qǐng)求頭指明了服務(wù)器的域名(對(duì)于虛擬主機(jī)來說),以及(可選的)服務(wù)器監(jiān)聽的TCP端口號(hào)。
如果沒有給定端口號(hào),會(huì)自動(dòng)使用被請(qǐng)求服務(wù)的默認(rèn)端口(比如請(qǐng)求一個(gè)HTTP的URL會(huì)自動(dòng)使用80端口)。
HTTP/1.1 的所有請(qǐng)求報(bào)文中必須包含一個(gè)Host頭字段。如果一個(gè) HTTP/1.1 請(qǐng)求缺少 Host 頭字段或者設(shè)置了超過一個(gè)的 Host 頭字段,一個(gè)400(Bad Request)狀態(tài)碼會(huì)被返回。
從上面的文字中可以總結(jié)出如下信息:
1、host的值為客戶端請(qǐng)求的服務(wù)器的域名(或者ip)和端口
2、http/1.1中必須包含host請(qǐng)求頭,且只能設(shè)置一個(gè);
那么host主要用在什么地方呢?
host用的最多的場景是:單臺(tái)服務(wù)器設(shè)置多個(gè)虛擬主機(jī)時(shí)。
舉個(gè)簡單的例子: 我在IP地址為127.0.0.1的服務(wù)器上,通過apache配置了兩個(gè)虛擬主機(jī):a.com,b.com,這兩個(gè)域名通過DNS解析都會(huì)指向127.0.0.1,我在瀏覽器中訪問a.com的網(wǎng)站時(shí),DNS將域名轉(zhuǎn)化為IP地址,此時(shí)可以通過客戶端請(qǐng)求頭的host信息判斷訪問的是服務(wù)器上對(duì)應(yīng)的虛擬主機(jī)。
如圖:
如果沒有host請(qǐng)求頭,客戶端的請(qǐng)求就不能標(biāo)記出該訪問哪個(gè)虛擬主機(jī)了。
接著看一下MDN對(duì)referer的介紹:
Referer 首部包含了當(dāng)前請(qǐng)求頁面的來源頁面的地址,即表示當(dāng)前頁面是通過此來源頁面里的鏈接進(jìn)入的。服務(wù)端一般使用 Referer 首部識(shí)別訪問來源,可能會(huì)以此進(jìn)行統(tǒng)計(jì)分析、日志記錄以及緩存優(yōu)化等。
需要注意的是 referer 實(shí)際上是 "referrer" 誤拼寫。
在以下兩種情況下,Referer 不會(huì)被發(fā)送:
1.來源頁面采用的協(xié)議為表示本地文件的 "file" 或者 "data" URI;
2.當(dāng)前請(qǐng)求頁面采用的是非安全協(xié)議,而來源頁面采用的是安全協(xié)議(HTTPS)。
3.直接輸入網(wǎng)址或通過瀏覽器書簽訪問
4.使用 JavaScript 的 Location.href 或者是 Location.replace()
5.使用html5中noreferrer
<a href="/test/index.php?noreferer" rel="noreferrer" target="_blank">noreferrer</a>
<a href="/test/index.php?noreferer" rel="noreferrer" target="_blank">noreferrer</a>
6.使用 Referer Meta 標(biāo)簽控制 referer 使用場景,具體參考如下文章:https://www.jb51.net/article/137982.htm
7.使用iframe的hack寫法去除referer。
這里給大家舉一個(gè)例子,百度的圖片防盜鏈:
html代碼如下:
鼠標(biāo)雙擊這張網(wǎng)頁直接打開,也就是file協(xié)議訪問,此時(shí)是不帶referer的,圖片是顯示的,如圖:
network如圖,此時(shí)沒有referer請(qǐng)求頭:
但是我將其發(fā)布到服務(wù)器上,用http://127.0.0.1/a2.html來訪問,如圖:
圖片不顯示了,為什么呢?觀察請(qǐng)求頭,如圖:
多了一個(gè)referer的請(qǐng)求頭,請(qǐng)求頭標(biāo)識(shí)了訪問這張圖片請(qǐng)求的源頭,請(qǐng)求源頭為我的網(wǎng)站,百度圖片服務(wù)器根據(jù)這個(gè)請(qǐng)求頭判斷,然后將我攔截了。
那么如何破解盜鏈呢,常用的是用一個(gè)服務(wù)器程序作為代理爬蟲,服務(wù)器爬蟲可以自由設(shè)置請(qǐng)求頭了,還有就是利用iframe的hack寫法了。這種寫法類似xss,那什么是xss呢?這里先不說,下期討論。
iframe去除referer的寫法如下,看代碼:
顯示結(jié)果如圖:
再看network如圖:
referer消失了。referer消失后,跳過了百度的防盜鏈。
最后是origin了,看一年MDN對(duì)其的介紹:
請(qǐng)求首部字段 Origin 指示了請(qǐng)求來自于哪個(gè)站點(diǎn)。該字段僅指示服務(wù)器名稱,并不包含任何路徑信息。該首部用于 CORS 請(qǐng)求或者 POST 請(qǐng)求。除了不包含路徑信息,該字段與 Referer 首部字段相似。
可以看到referer與origin功能相似,但是還是有幾點(diǎn)不同,仔細(xì)看上面的介紹,總結(jié)如下幾點(diǎn):
1、只有跨域請(qǐng)求,或者同域時(shí)發(fā)送post請(qǐng)求,才會(huì)攜帶origin請(qǐng)求頭,而referer不論何種情況下,只要瀏覽器能獲取到請(qǐng)求源都會(huì)攜帶,除了上面提到的幾種情況。
2、如果瀏覽器不能獲取請(qǐng)求源,那么origin滿足上面情況也會(huì)攜帶,不過其值為null,如圖:
這點(diǎn)與referer不同,瀏覽器如果不能獲取請(qǐng)求源,那么請(qǐng)求頭中不會(huì)攜帶referer。
3、origin的值只包括協(xié)議、域名和端口,而erferer不但包括協(xié)議、域名、端口還包括路徑,參數(shù),注意不包括hash值。
關(guān)于host、referer和origin的區(qū)別有哪些就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。