我們知道,在頁面引入圖片、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" >
這是,即可正常顯示了