HTTP之referrer


  我們知道,在頁面引入圖片、JS 等資源,或者從一個頁面跳到另一個頁面,都會產生新的 HTTP 請求,瀏覽器一般都會給這些請求頭加上表示來源的 Referrer 字段。Referrer 在分析用戶來源時很有用,有着廣泛的使用。但 URL 可能包含用戶敏感信息,如果被第三方網站拿到很不安全(例如之前不少 Wap 站把用戶 SESSION ID 放在 URL 中傳遞,第三方拿到 URL 就可以看到別人登錄后的頁面)。之前瀏覽器會按自己的默認規則來決定是否加上 Referrer。 

 

Referrer Policy States

新的 Referrer Policy 規定了五種 Referrer 策略:No Referrer、No Referrer When Downgrade、Origin Only、Origin When Cross-origin、和 Unsafe URL。之前就存在的三種策略:never、default 和 always,在新標准里換了個名稱。他們的對應關系如下:

策略名稱 屬性值(新) 屬性值(舊)
No Referrer no-referrer never
No Referrer When Downgrade no-referrer-when-downgrade default
Origin Only origin -
Origin When Cross-origin origin-when-crossorigin -
Unsafe URL unsafe-url always

可以看到,新標准給之前的三種策略賦予了更具意義的新名稱,同時還增加了兩種新策略。另外現階段支持 Referrer Policy 的瀏覽器保留了對舊標准的支持,但還是推薦大家盡快更新。簡單介紹下這五種類型的具體含義:

  • No Referrer:任何情況下都不發送 Referrer 信息;
  • No Referrer When Downgrade:僅當發生協議降級(如 HTTPS 頁面引入 HTTP 資源,從 HTTPS 頁面跳到 HTTP 等)時不發送 Referrer 信息。這個規則是現在大部分瀏覽器默認所采用的
  • Origin Only:發送只包含 host 部分的 Referrer。啟用這個規則,無論是否發生協議降級,無論是本站鏈接還是站外鏈接,都會發送 Referrer 信息,但是只包含協議 + host 部分(不包含具體的路徑及參數等信息);
  • Origin When Cross-origin:僅在發生跨域訪問時發送只包含 host 的 Referrer,同域下還是完整的。它與 Origin Only 的區別是多判斷了是否 Cross-origin。需要注意的是協議、域名和端口都一致,才會被瀏覽器認為是同域;
  • Unsafe URL:無論是否發生協議降級,無論是本站鏈接還是站外鏈接,統統都發送 Referrer 信息。正如其名,這是最寬松而最不安全的策略;

 

具體使用

CSP 響應頭

CSP(Content Security Policy),是一個跟頁面內容安全有關的規范。在 HTTP 中通過響應頭中的 Content-Security-Policy 字段來告訴瀏覽器當前頁面要使用何種 CSP 策略。現在 CSP 還可以通過 referrer 指令和五種可選的指令值,來指定 Referrer 策略,格式非常簡單:

Content-Security-Policy: referrer no-referrer|no-referrer-when-downgrade|origin|origin-when-cross-origin|unsafe-url;

注:根據文檔,通過 CSP 頭部設置 Origin When Cross-origin 策略時,指令值應該用 origin-when-cross-origin,這跟前面的表格里的 origin-when-crossorigin 有差異。實際上經過測試,Chrome 42 只支持 origin-when-crossorigin,后續會不會變還不知道,建議大家使用時,自己先測一下。

CSP 的指令和指令值之間以空格分割,多個指令之間用英文分號分割。

<meta> 標簽

通過 <meta> 標簽也可以指定 Referrer 策略,同樣很簡單:

<meta name="referrer" content="no-referrer|no-referrer-when-downgrade|origin|origin-when-crossorigin|unsafe-url">

需要注意的是,<meta> 只能放在 <head>...</head> 之間,如果出現的位置不對會被忽略。同樣,如果沒有給它定義 content 屬性,或者 content 屬性為空,也會被忽略。如果 content 屬性不是合法的取值,瀏覽器會自動選擇 no-referrer 這種最嚴格的策略。

<a> 標簽的 referrer 屬性

通過給 <a> 標簽增加 referrer 屬性也可以指定 Referrer 策略,格式如下:

<a href="http://example.com" referrer="no-referrer|origin|unsafe-url">xxx</a>

這種方式作用的只是這一個鏈接。並且,<a> 標簽可用的 Referrer 策略只有三種:不傳、只傳 host 和都傳。另外,這樣針對單個鏈接設置的策略優先級比 CSP 和 <meta>要高。

需要注意的是:經過我的測試,目前並沒有哪個瀏覽器實現了對 referrer 屬性的支持。現階段,如果要針對單個鏈接去掉 Referrer,還是推薦使用下面這種支持度更好的寫法:

<a href="http://example.com" rel="noreferrer">xxx</a>

另外再重復一遍,現階段的瀏覽器還保留了對 never、default 和 always 的支持,但是已經不推薦使用了。

 

可以看到,通過新的 Referrer 策略,網站所有者可以選擇更高的安全級別來保證用戶隱私不被泄露;也可以選擇更低的安全級別來獲得一些便利,相比之前只能由瀏覽器默認策略一刀切,確實靈活了不少。

 

應用場景

  1. 在獲取微信頭像的情況,如果通過img標簽去加載微信頭像,這個時候,可能由於微信對於圖片防盜鏈的限制而無法正常顯示,這個時候可以添加

 

<meta name="referrer" content="no-referrer" > 

 

  這是,即可正常顯示了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM