HTTP請求中的referrer和Referrer-Policy

Lingzhi發表於2019-05-12
本文將介紹一個涉及安全和隱私的http請求頭中的欄位—referrer,以及如何通過Referrer Policy去修改referrer的值或者是顯示與否。

什麼是referrer

當一個使用者點選當前頁面中的一個連結,然後跳轉到目標頁面時,目標頁面會收到一個資訊,即使用者是從哪個源連結跳轉過來的。如下圖所示:

HTTP請求中的referrer和Referrer-Policy

也就是說,當你發起一個http請求,請求頭中的referrer欄位就說明了你是從哪個頁面發起該請求的。

使用場景

有時候我們需要控制這個referrer欄位的值,即是否讓其顯示在請求頭中,或者是否顯示完整路徑等。尤其是在以下兩個使用場景:

隱私

在社交網站的個人中心頁面,也許會存在一些外鏈,這時候社交網站肯定不希望使用者在點選這些連結跳轉到其他第三方網站時會將自己個人中心的URL資訊顯示在referrer欄位中傳過去,尤其是個人中心頁面的URL往往會帶著使用者資料和一些敏感資訊。這時候可以選擇不顯示來源頁面URL資訊或者只顯示一個網站根地址hostname。

安全

有些使用了https的網站,可能在URL中使用一個引數(sid)來作為使用者身份憑證,而又需要引入其他https網站的資源,這種情況,網站肯定不希望洩露使用者的身份憑證資訊。當https網站需要引入不安全的http網站的資源或者有連結要跳轉到http網站時,這時候將https源網站的URL資訊傳過去也是不太安全的。

當然還有其他情況下需要referrer的值,比如最近公司所做的專案中,有一個請求由於請求頭過大導致響應是400,我們的Referrer Policy是預設的情況,顯示的referrer是完整的URL資訊,該URL帶了很多敏感資料比如加密後的token,sessionID等,長度特別長,請求頭中的cookie和請求的URL也帶著很大塊的資訊,最終我們決定讓referrer只攜帶網站根地址的資訊而不是其完整路徑,由此減小了header的大小。

Referrer-Policy

Referrer-Policy的作用就是為了控制請求頭中referrer的內容,目前是一個候選標準,不過已經有部分瀏覽器支援該標準。
目前Referrer-Policy只包含以下幾種值:
enum ReferrerPolicy {
"",
"no-referrer",
"no-referrer-when-downgrade",
"same-origin",
"origin",
"strict-origin",
"origin-when-cross-origin",
"strict-origin-when-cross-origin",
"unsafe-url"
};複製程式碼

空字串

若設為空串則預設按照瀏覽器的機制設定referrer的內容,預設情況下是和no-referrer-when-downgrade設定得一樣。

no-referrer

不顯示referrer的任何資訊在請求頭中。

no-referrer-when-downgrade

這是預設值。當從https網站跳轉到http網站或者請求其資源時(安全降級HTTPS→HTTP),不顯示referrer的資訊,其他情況(安全同級HTTPS→HTTPS,或者HTTP→HTTP)則在referrer中顯示完整的源網站的URL資訊。

same-origin

表示瀏覽器只會顯示referrer資訊給同源網站,並且是完整的URL資訊。所謂同源網站,是協議、域名、埠都相同的網站。

origin

表示瀏覽器在referrer欄位中只顯示源網站的源地址(即協議、域名、埠),而不包括完整的路徑。

strict-origin

該策略更為安全些,和origin策略相似,只是不允許referrer資訊顯示在從https網站到http網站的請求中(安全降級)。

origin-when-cross-origin

當發請求給同源網站時,瀏覽器會在referrer中顯示完整的URL資訊,發個非同源網站時,則只顯示源地址(協議、域名、埠)

strict-origin-when-cross-origin

origin-when-cross-origin相似,只是不允許referrer資訊顯示在從https網站到http網站的請求中(安全降級)。

unsaft-url

瀏覽器總是會將完整的URL資訊顯示在referrer欄位中,無論請求發給任何網站。

Referrer-Policy更改方法

可以有以下5種方法:

1. 通過Referrer-Policy HTTP header設定:

Referrer-Policy: origin複製程式碼

2. 通過<meta>元素改變Referrer Policy,直接修改名為referrer的內容

<meta name="referrer" content="origin">複製程式碼

3.<a>, <area>, <img>, <iframe>, 或者<link>元素設定referrerpolicy屬性

<a href="http://example.com" referrerpolicy="origin">複製程式碼

4. 如需設定不顯示referrer資訊時,也可以給 <a>, <area>, <link>元素設定rel的連結關係。

<a href="http://example.com" rel="noreferrer">複製程式碼

總結

使用何種Referrer Policy取決於網站的需求,但是一般來說,unsafe-url是不太建議用的,同樣,如果是隻想顯示網站的根地址,那麼建議用strict-origin和strict-origin-when-cross-origin。如果URL中沒有什麼敏感資訊,那就預設使用no-referrer-when-downgrade



相關文章