在網站上安全地嵌入內容

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 可能需要選取文件在受限框架內顯示

舉例來說,系統會為 FLEDGE API 廣告競價的得標者建立受限區塊。FLEDGE API 會提供不透明來源,也就是不受位置限制的 URN 配置,可在受限的框架內顯示。不透明來源可讓網站在網站上顯示內容,而無須向網站擁有者揭露廣告來源網址。

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

最終,柵欄框架不會取代 iFrame。您不必使用這些功能。當需要在同一頁面上顯示不同頂層區塊的資料時,建議使用圍欄框架,以便使用更私密的框架。

透過入口網站嵌入

Portal (<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>),以改善安全性和樣式。我們會持續分享圍欄廣告框提案的進度。