
Zobrazování stránek v rámech s frame-ancestors
Pomocí CSP hlavičky frame-ancestors jde umožnit načtení stránky do <iframe>.
HTML značka <iframe> má dost zajímavou historii.
V dávných dobách se používala pro načítání společných částí stránek jako je třeba menu nebo patička (než se víc prosadilo např. skládání obsahu v PHP).
Největší využití má ale nejspíš pro zobrazení cizích webů.
Dříve se touto značkou hojně řešilo vkládání dynamického obsahu. Jako třeba různých anket, chatů, komentářů a podobně.

Takové věci se dnes obvykle řeší spíš JavaScriptem, který do stránky přímo přidává potřebné HTML elementy.
Asi nejrozšířenější je používání <iframe> pro reklamu, protože JS je hodně mocný kvůli tomu, že má prakticky neomezenou kontrolu nad stránkou.
A u reklamy, která se ve finále často načítá bůhvíodkud, je spíš žádoucí, aby se stránkou nemohla manipulovat.
Clickjacking
Další hodně populární využití rámů byl tzv. clickjacking.

To spočívalo v tom, že se na stránku umístil nějaký lákavý prvek, na který má návštěvník kliknout. Přes ten se absolutně naposicovala nějaká stránka v <iframe>.
Díky zprůhlednění rámu této stránky CSS vlastností opacity tak mohl návštěvník nevědomky kliknout na nějakou akci.
Zákaz načtení do <iframe>
Jako prevence clickjackingu je dost běžné, že dnes skoro žádný web nejde do rámu načíst.

Dříve se to řešilo hlavičkou X-Frame-Options:
X-Frame-Options: DENY
X-Frame-Options: SAMEORIGIN
Povolení vybraných domén
Právě frame-ancestors je nástupcem X-Frame-Options sloužící k povolení konkrétních webů, které mohou danou stránku načíst do rámu.
Tyto domény je nutné vyjmenovat. Takže provozovatel webu musí ručně udělit souhlas s načítáním do rámu. Jinak to prohlížeče zablokují.
Používá se přes hlavičku Content-Security-Policy:
Content-Security-Policy: frame-ancestors 'self' https://jecas.cz https://*.example.com;
Tento zápis znamená, že stránka, která tuto hlavičku posílá, může být vložena do rámu na:
-
'self'– na stejné doméně -
https://jecas.cz– na stráncehttps://jecas.cz -
https://*.example.com– na libovolné subdoméněexample.coms HTTPS protokolem
Klíčovým slovem 'none' se celkově zablokuje načtení do rámu.
- MDN: CSP: frame-ancestors
Jak nastavit HTTP hlavičku
Nastavení Content-Security-Policy hlavičky závisí na použité technologii.
V každém případě musí hlavička přijít přímo ze serveru. Nastavit ji například klientským JS tak není možné.
Apache .htaccess
Header set Content-Security-Policy "frame-ancestors 'self' https://example.com"
Nginx
add_header Content-Security-Policy "frame-ancestors 'self' https://example.com";
PHP
header("Content-Security-Policy: frame-ancestors 'self' https://example.com");
Související články
JavaScript Battery API
Jak v JS zjistit stav baterie, co dnes funguje a kdy API nepoužívat.