Referrer策略與防盜鏈

Referrer策略用於控制瀏覽器在何種情況下發送referrer信息。該策略可以保護用戶的隱私,但也可以使得目前絕大多數站點的防盜鏈機制失效。

一、介紹
從一個文檔發出的請求,以及從文檔導航到其他頁面,都會有一個Referer頭。出於以下原因,我們有時會希望瀏覽器不發送referer頭:
1.隱私
一個社交網站會有每個用戶的簡介頁面,用戶會在他們的個人主頁中添加一些鏈接。社交網站可能不希望泄露用戶的個人主頁URL給被鏈接的網站(因爲個人主頁URL可能會泄露其主人的身份信息)。
一些社交網站可能想通知其他網站該鏈接是從社交網站發起的,但不想泄露包含用戶信息的鏈接(例如,微博中的鏈接希望告訴對方該鏈接是在微博中連接過來的,但不希望告訴對方從誰的微博連接過來)。

2.安全
一個網站應用使用https和基於URL的會話標識。應用也許希望鏈接其他站點的https資源但不想泄露位於URL中的用戶會話標識符。
或者,應用可以使用一些url自身的能力(如重置密碼的鏈接、通過鏈接直接登錄賬號等)。控制referrer有助於阻止這些有特殊能力的url泄露referrer頭。
注意,有其他方式避免這些url的泄露,控制referrer並不足以控制所有的泄露情況。

3.引用
基於HTTPS的博客可能希望連接到一個HTTP上的博客並收到引用鏈接。

二、referrer策略
Referrer策略包含以下值:

  1. 空字符串
  2. no-referrer
  3. no-referrer-when-downgrade
  4. same-origin
  5. origin
  6. strict-origin
  7. origin-when-cross-origin
  8. strict-origin-when-cross-origin
  9. unsafe-url

下面會詳細講解每種Referrer策略。
1.no-referrer
最簡單的策略是“no-referrer”,表示所有的請求都不帶referrer。
http://www.lyz810.com/demo/referrer/index.php?referrer=no-referrer

2.no-referrer-when-downgrade
主要針對於受TLS保護的URL(如https),簡單的說就是https的頁面中,當連接的資源也是https的,則發送完整的referrer,如果連接的資源是http的,就不發送referrer
https://www.lyz810.com/demo/referrer/index.php?referrer=no-referrer-when-downgrade
此例中,音樂可以播放,因爲他是http的,不發送referrer,iframe可以顯示referrer,因爲是https協議。
這個是在沒有特別指定referrer策略時,瀏覽器的默認行爲。

3.same-origin
對於同源的鏈接,會發送referrer,其他的不會。同源意味着域名需要相同,example.com和not.example.com是非同源的。
http://www.lyz810.com/demo/referrer/index.php?referrer=same-origin
上面的例子中可以看到,音樂無法播放了(因爲是他站資源),而iframe嵌套的同源頁面仍然可以讀到referrer。

4.origin
這個策略對於任何資源來說只發送源的信息,不發送完整的url。
http://www.lyz810.com/demo/referrer/index.php?referrer=origin
此例中,音樂無法播放,因爲它發送了referrer,iframe中顯示的referrer只包含源的信息,不包含完整的url。

5.strict-origin(瀏覽器可能不支持)
這個策略類似於origin和no-referrer-when-downgrade的合體,如果一個https頁面中鏈接到http的頁面或資源,則不會發送referrer。http頁面鏈接以及https鏈接到https都只發送來源頁面的源信息。
https://www.lyz810.com/demo/referrer/index.php?referrer=strict-origin
此例中,音樂正常播放,因爲是http的資源,不發送referrer,而iframe中只有源信息。

6.origin-when-cross-origin
該策略在同源的鏈接中發送完整的URL,其他情況僅發送源信息。相同的域名,http和https協議被認爲是非同源的。
http://www.lyz810.com/demo/referrer/index.php?referrer=origin-when-cross-origin
此例中,音樂不能播放,發送源信息,iframe顯示完整url。
7.strict-origin-when-cross-origin(瀏覽器可能不支持)
對於同源請求,發送完整的URL;對於同爲https的,只發送源信息;對於http頁面只發送源信息;https頁面中的http請求不發送referrer。

8.unsafe-url
這個主要是解決https頁面中的http資源不發referrer的問題,它會使在https頁面中http資源發送完整的referrer。
https://www.lyz810.com/demo/referrer/index.php?referrer=unsafe-url
此例中,音樂不能播放,雖然頁面是https,資源是http,但unsafe-url使得瀏覽器仍發送referrer。

9.空字符串
空字符串表示沒有referrer策略,默認爲no-referrer-when-downgrade。

三、用法
Referrer策略可以通過以下方法聲明:
1.通過http請求頭中的Referrer-Policy字段
2.通過meta標籤,name爲referrer
3.通過<a>、<area>、<img>、<iframe>、<link>元素的referrerpolicy屬性。
4.通過<a>、<area><link>元素的rel=noreferrer屬性
5.通過隱式繼承

四、用法舉例
1.http請求頭
Referrer-Policy: no-referrer
2.meta標籤
<meta name=”referrer” content=”no-referrer” />
3.referrerpolicy屬性
<a href=“http://example.com” referrerpolicy=“origin”>
4.rel=noreferrer屬性

五、注意事項
Referrer策略還有其他歷史遺留的值:
1.never等價於no-referrer
2.default等價於no-referrer-when-downgrade
3.always等價於unsafe-url
4.不建議使用上面三個值,建議使用後面的新值

六、兼容性
IE:不支持(IE高版本中隱式支持default,https頁面拉取的http資源不會加referrer)
Edge:僅支持較早版本的值(never、always、origin、default)
Firefox:36+
Chrome:21+
Safari:7.1+(僅支持較早版本的4個值)
Opera:15+
iOS Safari:8+(僅支持較早版本的4個值)

七、關於防盜鏈
目前大部分網站採用的是判斷referrer是否是當前域名或指定白名單域名下的url。而沒有referrer的請求都會放行。
referrer策略普及後,單從referrer判斷防盜鏈的方法會失效,所以需要考慮其他的技術手段實現防盜鏈機制。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章