在網站上安全地嵌入內容

Jack J
Jack J
Alexandra Klepper
Alexandra Klepper

嵌入內容是讓使用者留在網站上的最佳方式,同時還能分享其他網頁或網站的內容。例如內嵌推文,這類推文會以 Twitter 的樣式和格式顯示。這類網站可大可小,例如嵌入你網站的 Shopify 商店,訪客不必離開你的網站就能購物。

現在,嵌入內容時確保網站安全比以往更加重要。

開發人員可以透過幾種方式在網站上嵌入內容。最常見的技術是使用 <iframe>,只要提供網址,就能在網站上嵌入任何內容。您目前可以新增 sandbox 屬性,讓 iframe 更安全。

或者,您也可以使用建議的 HTML 元素:

  • <fencedframe> 提案是保護隱私權的第三方內容嵌入方式。
  • <portal>,讓頁面轉換更流暢。

請繼續閱讀,瞭解如何提升嵌入內容的安全性。

使用 iframe 嵌入

iframe 可用於各種用途,例如在聯絡人頁面中新增地圖或表單,以及顯示廣告。

<iframe src="https://example.com/maps"></iframe>

每個 iframe 都有自己的瀏覽背景資訊,包括專屬的工作階段記錄和文件。內嵌 iframe 的背景資訊稱為父項瀏覽背景資訊。

在 iframe 中顯示的第三方內容可透過 postMessage() 與父項網站互動。開發人員可藉此在瀏覽環境之間傳送任意值。訊息接收器可以使用事件監聽器 onmessage 接收值。

// inside iframe
window.parent.postMessage("ping", "https://example.com");

// window
window.addEventListener("message", (event) => {
  console.log(event.data);
})

透過 sandbox 屬性提升安全性

如果 iframe 中部署了惡意內容,可能會執行非預期的動作 (例如執行 JavaScript 或提交表單)。為避免發生這種情況,sandbox 屬性會限制 iframe 中的可執行 API,並停用可能有害的功能。

<iframe src="https://example.com" sandbox></iframe>

Sandbox 可能會停用對嵌入內容而言相當重要的 API。如要允許使用已停用的 API,可以明確地在沙箱屬性中加入引數。

<iframe sandbox="allow-forms" src="https://example.com"></iframe>

sandbox 規格有許多可能的值,包括 allow-formsallow-same-originallow-popups 等。

權限政策

隨著網頁功能越來越強大,我們制定了權限政策,用來管理所有權限。權限政策可套用至父項網站和 iframe 內容。使用 allow 屬性,也可以將授予父項網站的權限授予 iframe。

<iframe src="https://example.com" allow="fullscreen"></iframe>

使用圍欄頁框嵌入

設有圍欄的頁框 (<fencedframe>) 是建議用於嵌入內容的 HTML 元素,類似於 iframe。與 iframe 不同,Fenced Frame 會限制與嵌入環境的通訊,允許框架存取跨網站資料,但不與嵌入環境共用。同樣地,父項頁面的第一方資料也無法與設有安全防護的影格共用。

<fencedframe src="https://3rd.party.example"></fencedframe>

Fenced Frames 是 Privacy Sandbox 提案,建議頂層網站應將資料劃分為不同區塊。許多 Privacy Sandbox 提案的目標,都是在不使用第三方 Cookie 或其他追蹤機制的情況下,滿足跨網站用途。某些 Privacy Sandbox API 可能需要在 Fenced Frame 中算繪特定文件。

舉例來說,系統會為 FLEDGE API 廣告競價的得主建立設限框架。FLEDGE API 會提供不透明來源,也就是與位置無關的 URN 配置,可在設有範圍的影格中算繪。不透明來源可讓網站在自家網站上顯示內容,而不向網站擁有者揭露廣告來源網址。

<fencedframe src="urn:uuid:c36973b5-e5d9-de59-e4c4-364f137b3c7a"></fencedframe>

最終,設有圍欄的影格不會取代 iframe。您不必使用這些資訊。 如果要在同一頁面顯示來自不同頂層分割區的資料,建議使用圍欄架構,因為這種架構的隱私權保護機制更完善。

透過入口網站嵌入

入口網站 (<portal>) 是建議使用的 HTML 元素,具有獨立的瀏覽環境,可提升網頁轉場體驗。入口網站會嵌入 iframe 等內容,但使用者無法存取入口網站的程式碼。入口網站僅供檢視,使用者無法與之互動。

入口網站的複雜度不高,但可提供單頁應用程式的無縫轉場效果。這些轉場效果可以動畫呈現,快速取代瀏覽器視窗中的內容。

<portal src="https://example.com/"></portal>

入口網站規格仍處於初期開發階段。

用於嵌入的其他 HTML 元素

在網路發展歷程中,曾有許多提議的 HTML 元素和建立的 API 用於嵌入內容。在一段時間內,使用多個 <frame><frameset> 元素建立網站是很常見的做法。如果網站含有多個 <frameset> 元素,網址列會顯示父項網頁的網址,無論多個個別框架的來源為何。因此難以分享網站內內容的連結。這些 API 隨後已遭淘汰。

此外,過去也曾使用外掛程式技術 (例如 Java <applet> 元素) 涵蓋其他用途。這個元素後來由 <object> 元素取代。這兩個元素通常用於顯示 Flash 外掛程式,但也用於顯示其他 HTML 元素 (類似於 iframe)。其他元素 (例如 <canvas><audio><video><svg>) 則會同時將 <object><applet> 元素淘汰。

雖然 <object><embed> 尚未正式淘汰,但最好避免使用,尤其是因為這些函式有奇怪的行為<applet> 已於 2017 年從 HTML 規格中移除

結論

您可以使用現有的 iframe 規格,在任何網站上安全地嵌入內容。為提升安全性及樣式,我們建議使用更多 HTML 元素,包括 <fencedframe><portal>。我們會持續分享設有圍欄的影格提案的進展。