Security: rel=“noreferrer noopener nofollow”

源碼掃描時被要求 <a target=”_blank” /> 標籤要加上 rel=”noopener noreferrer”,先簡單總結加上這兩個屬性值的安全性考量:

  1. noreferrer 可避免目的地網頁送出請求時,所送出請求的標頭帶上Referer讓目的端辨識來源端是從哪裡來,有關Referer標頭衍生的安全問題可參考MDN

  2. noopener可避免目的地網頁使用window.opener取得來源地原始網頁內容並變更,此類型攻擊稱為 ”tabnapping”,例如目的地網頁可以用window.opener再把你導向其他網頁。

不過這些屬性值其實有它的作用存在,例如可用來caching、流量分析等,接下來稍微探討noreferrernoopener以及常被一起討論的nofollow三者的作用和優缺點:

noreferrer

如上所述,noreferrer用來避免送出的請求標頭帶上Refer。未使用noreferrer的情況下,被請求端可針對來源端標頭的Referrer資訊作分析,例如了解網站的引薦流量;但如果加上此屬性值,這些引薦流量就會被視為”直接流量”而無法得知哪些流量是從哪些入口輾轉而來。

noopener

開啟外部連結的時候,來源端的內容可被開啟的目的地網頁程式碼透過window.opener去存取或跳轉至其他頁面。要注意的是,某些版本瀏覽器未支援<a target=”_blank” />預設加入等同rel=”noopener”的行為,所以建議還是加上此屬性值。

nofollow

增加nofollow會取消原始網站與所連結的外部網站的關聯。此屬性值只會影響外部網站的SEO,因為搜尋引擎會藉由網站之間的連結計算網站排名,如果愈多高知名度網站連結到某一網站,則該網站的排名可能就會愈高,所以可在外部連結加上nofollow避免替別的網站”背書”。


References