Show Menu
主題×

內容安全性原則 (CSP)

內容安全性原則 (CSP) 的主要目標是防止跨網站指令碼攻擊 (XSS)。瀏覽器遭到誘騙而執行看似來自信任的來源,但其實是來自其他位置的惡意內容時,就會發生這種情況。CSP 能讓瀏覽器 (代表使用者) 驗證指令碼是否的確來自信任的來源。
若要實作 CSP,請將 Content-Security-Policy HTTP 標題新增到伺服器回應。您可以前往 Mozilla Developer Network 網站 https://developer.mozilla.org/zh-TW/docs/Web/HTTP/CSP ,深入了解信任來源的相關資訊

需克服的問題

設計上,標籤管理系統是以動態方式載入指令碼。CSP 的設計宗旨就是要封鎖這些以動態方式載入的指令碼,因為這些指令碼會造成安全性問題。
如果您希望 Launch 能與 CSP 搭配使用,有兩個主要難題需要克服:
  • Launch 程式庫必須使用受信任的來源。 ​若不符合這項條件,瀏覽器就會封鎖 Launch 程式庫和其他必要的 JavaScript 檔案,使其無法在頁面上載入。
  • 須允許內嵌指令碼。 ​若不符合這項條件,頁面會封鎖自訂程式碼動作,使自訂程式碼動作無法正常執行。
如果您希望使用 Launch ​部署 CSP,請修正這兩項問題,並妥善將其他指令碼標示為安全指令碼。安全性提升需要有所付出,亦即工作量會增加。

信任的來源

如果您是自行託管程式庫,程式庫的來源可能是您自己的網域。您可以將主機網域指定為安全來源,如下所示:
script-src 'self'
如果程式庫是由 Adobe 託管 (使用 Managed by Adobe 主機),則程式庫是在 assets.adobedtm.com 上維護。在此情況下,您的原則應該設定如下:
script-src 'self' assets.adobedtm.com
您應將 self 指定為安全網域,這樣就不會破壞已載入的任何指令碼,但您也需要將 assets.adobedtm.com 列為安全項目,否則頁面不會載入您的 Launch 程式庫。
您可以在 Mozilla Developer Network 網站 上閱讀更多有關受信任來源的資訊。

內嵌指令碼

內嵌指令碼對 CSP 而言是個難題,因為預設上不允許使用內嵌程式碼。您可透過兩個選項,允許系統內嵌指令碼:
  • 允許所有內嵌指令碼 (最不安全)
  • 透過 Nonce 允許 (安全性高)
CSP 規格針對使用雜湊的第 3 種選項有詳細的說明,但這種作法不適用於所有類型的 TMS,原因很多,有些還很複雜。

安全性高 - Nonce

此方法包括產生 Nonce,並將其新增至 CSP 和每個內嵌指令碼。瀏覽器收到指示要載入帶有 Nonce 的內嵌指令碼時,會比較 Nonce 值與 CSP 標題中的值。如果相符,就會載入指令碼。
每次載入新頁面時,此 Nonce 的值應該都會不同。
有一個非常重要的先決條件: 您必須 非同步 載入 Launch 程式庫。無法同步載入 Launch 程式庫 (這會導致主控台發生錯誤,且規則無法正確執行)。
您可以將 Nonce 新增至上述由 Adobe 託管的 CSP 範例,如下所示:
script-src 'self' assets.adobedtm.com 'nonce-2726c7f26c'
接著,您必須告訴 Launch 要在哪個位置找到 Nonce。Launch 會在載入內嵌指令碼時使用該 Nonce。若要讓 Launch 在載入指令碼時使用 Nonce,您必須:
  1. 建立參照 Nonce 的資料元素 (無論置於資料層的哪個位置)。
  2. 設定核心擴充功能,並指定要使用的資料元素。
  3. 發佈您的資料元素和核心擴充功能變更。
另請注意: 這只能處理自訂程式碼的載入作業,無法處理自訂程式碼本身。您或許可以撰寫不遵循 CSP 的自訂程式碼,這樣 CSP 便會優先執行。例如,如果您使用自訂程式碼,透過將內嵌指令碼附加至 DOM 來執行載入作業,Launch 將無法找到該指令碼或正確新增 Nonce,導致該特定自訂程式碼動作無法正常運作。

安全性低 - 允許內嵌

如果上述選項均不適用,您可以指示 CSP 允許所有內嵌指令碼。這是最不安全但最容易實作及維護的方法。
同樣地,假設您要讓 Adobe 管理託管作業,並將 assets.adobedtm.com 網域標示為信任來源,您的 CSP 應如下所示:
script-src 'self' assets.adobedtm.com 'unsafe-inline'
如需允許內嵌指令碼的詳細資訊,請參閱 MDN 網站上的 https://developer.mozilla.org/zh-TW/docs/Web/HTTP/Headers/Content-Security-Policy/script-src