Získání adresy URL rodiče prvku iframe

Zacházení s prvky iframe je vždy dvousečná zbraň. Na jedné straně získáte sandboxing obsahu na jiné stránce, což zajistí, že JavaScript a CSS z jedné stránky neovlivní jinou. Pokud je v prvku iframe zobrazena stránka z jiného původu, můžete si být také jisti, že stránka nemůže udělat nic škodlivého vůči stránce, která ji obsahuje. Na druhou stranu prvky iframe a jejich související window objekty jsou změť přípustných a nepřípustných akcí, které si musíte zapamatovat 1 . Práce s prvky iframe je často frustrací, když metodicky procházíte tím, co smíte dělat.

Nedávno jsem byl dotázán, zda existuje způsob, jak získat adresu URL nadřazené stránky prvku iframe, tedy adresu URL stránky s <iframe> živel. Zdá se to jako dostatečně jednoduchý úkol. U běžné stránky obvykle získáte adresu URL pomocí window.location . Existuje také parent získat window objekt nadřazené stránky a top získat window objekt nejvzdálenější stránky. Poté můžete použít parent.location nebo top.location získat adresu URL z obsahující stránky v závislosti na vašich potřebách. Alespoň tak to uděláte, když stránka iframe i stránka obsahující prvky jsou ze stejného původu.

Pokud jsou stránka iframe a stránka obsahující jiný původ, pak jste úplně odříznuti od parent.location a top.location . Tyto informace jsou považovány za nebezpečné pro sdílení napříč původy. To však neznamená, že nemůžete zjistit adresu URL příslušné stránky. Chcete-li tak učinit, musíte mít na paměti, jaké informace prvek iframe vlastní a jaké nikoli.

Chcete-li začít, měli byste znovu zkontrolovat, zda je stránka skutečně v prvku iframe, což můžete provést pomocí tohoto kódu:

var isInIframe = (parent !== window);

Když je stránka spuštěna uvnitř prvku iframe, parent objekt je jiný než window objekt. Stále máte přístup k parent z prvku iframe, i když na něm nemáte přístup k ničemu užitečnému. Tento kód nikdy nezpůsobí chybu ani při křížení počátků.

Jakmile zjistíte, že jste v prvku iframe, můžete využít málo známý fakt:HTTP Referer záhlaví stránky uvnitř prvku iframe je vždy nastaveno na adresu URL obsahující stránku. To znamená stránku vloženou do prvku iframe na https://humanwhocodes.com bude mít Referer záhlaví rovné této URL. S vědomím této skutečnosti stačí použít často zapomenutý document.referrer vlastnictví. Jako návrhy názvu tato vlastnost obsahuje hodnotu Referer záhlaví pro daný dokument. Adresu URL nadřazené stránky prvku iframe tedy můžete získat takto:

function getParentUrl() {
    var isInIframe = (parent !== window),
        parentUrl = null;

    if (isInIframe) {
        parentUrl = document.referrer;
    }

    return parentUrl;
}

I když to může vypadat jako bezpečnostní problém, není tomu tak. Referer se již odesílá na server, který obsluhuje stránku iframe, takže informace již webová aplikace zná. document.referrer vlastnost pouze odhaluje informace, které již server má. Od document objekt je vlastněn prvkem iframe window , nepřekračujete hranici zásad stejného původu.

Prvky iframe jsou vždy trochu chlupaté, zvláště když do mixu hodíte JavaScript. Dobrou zprávou je, že obvykle existuje způsob, jak udělat něco, co dává smysl a neohrožuje uživatele, ať už je to prostřednictvím document.referrer zasílání zpráv napříč dokumenty nebo jiné prostředky.

Odkazy

  1. Prvky iframe, onload a document.domain by me (NCZOnline)