Verificator iframe
Verificator iframe online gratuit: introdu orice adresă URL pentru a inspecta antetele X-Frame-Options și Content-Security-Policy frame-ancestors, află dacă pagina poate fi încorporată într-un iframe și confirmă prin intermediul unei previzualizări live. Istoricul se păstrează doar pentru sesiunea curentă a browserului.
Istoric (sesiunea curentă)
Salvat doar în această filă (sessionStorage); se șterge la închiderea acesteia. Nimic nu se transmite către server.
Cum funcționează verificarea
- Introdu adresa URL țintă și apasă Verifică. Serverul preia pagina ca pe o cerere reală de iframe (cu Sec-Fetch-Dest: iframe) și citește antetele de răspuns.
- Veredicul este stabilit în funcție de X-Frame-Options (DENY / SAMEORIGIN blochează încadrarea) și Content-Security-Policy frame-ancestors (doar `*` sau un wildcard de protocol permite orice sursă terță).
- Aceași adresă URL este încărcată în iframe-ul de previzualizare live, astfel încât să poți confirma modul exact în care reacționează browserul, inclusiv mecanismele JavaScript anti-frame pe care antetele nu le pot evidenția.
Ce determină dacă o pagină poate fi încorporată?
Faptul că o pagină web poate fi afișată într-un `<iframe>` pe un alt site este decis de browser, pe baza anteturilor de răspuns trimise de pagină. Verificatorul efectuează aceeași inspectare la nivel de server și îți oferă un rezultat instantaneu.
`X-Frame-Options` este antetul clasic: `DENY` interzice încorporarea pe toate paginile, `SAMEORIGIN` permite doar ca pagini din aceeași sursă să le încorporeze, iar `ALLOW-FROM` a fost eliminat din browserele moderne. Când antetul lipsește, regulile tradiționale nu blochează încorporarea.
`Content-Security-Policy frame-ancestors` este standardul modern. Listează originile autorizate să încorporeze pagina – de exemplu `frame-ancestors 'self' https://example.com`. Valoarea `*` (sau un protocol simplu precum `https:`) permite orice părinte HTTPS; orice altă valoare limitează încorporarea de către terți.
Anteturile nu spun totul: scripturile paginii pot executa cod anti-iframe (comparând `top !== self` și forțând o navigare la nivel maxim), iar paginile de login sau endpoint-urile restricționate geografic se pot comporta diferit pentru cererile din centre de date. De aceea, fiecare rezultat este însoțit de o previzualizare live.
Ghid rapid: configurarea antetelor de răspuns
Deții site-ul? Controlează încorporarea direct prin anteturile de răspuns.
Blochează încorporarea din orice pagină
X-Frame-Options: DENY
Content-Security-Policy: frame-ancestors 'none'
Broerele refuză să redenă pagina în niciun iframe – cea mai strictă protecție împotriva clickjacking-ului.
Permite doar încorporarea din aceeași sursă
X-Frame-Options: SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self'
Doar paginile cu același protocol, domeniu și port pot fi încorporate; site-urile terțe sunt blocate.
Permite doar anumite origini
Content-Security-Policy: frame-ancestors 'self' https://trusted.example.com
Adaugă originile de încredere în `frame-ancestors`; originile netotate vor fi blocate.
Permite încorporarea din orice pagină
Nu setați antetul X-Frame-Options
Content-Security-Policy: frame-ancestors *
Orice site poate încorpora pagina într-un iframe. Analizează implicațiile asupra securității.
Notă: X-Frame-Options a fost înlocuit de directiva CSP `frame-ancestors`. Când ambele sunt prezente, CSP prevalează – preferă `frame-ancestors`.
Cum detectează serverul că o cerere provine dintr-un iframe?
Din jurul anului 2020, browserele bazate pe Chromium și Firefox atașează automat un set de anteturi Fetch Metadata la fiecare cerere de navigare și de subresurse. Cea mai utilă pentru verificările de încorporare este `Sec-Fetch-Dest` – îl informează pe server despre contextul care a solicitat resursa, fără a necesita nicio acțiune din partea paginii sursă.
- Sec-Fetch-Dest: document — navigare la nivel maxim, nu este încărcat în niciun cadru.
- Sec-Fetch-Dest: iframe — cererea este încărcată în interiorul unui element `<iframe>`.
- Sec-Fetch-Dest: frame — încărcat în interiorul unui `<frame>` tradițional (frameset).
- Sec-Fetch-Dest: embed / object — încărcat în interiorul unui element `<embed>` sau `<object>`.
Acest verificator trimite propria sa solicitare de test cu Sec-Fetch-Dest: iframe, replicând exact ceea ce trimite un browser real atunci când încorporează o pagină — astfel, rezultatul reflectă modul în care serverul țintă se comportă de fapt pentru cereri reale de iframe, nu doar o simplă solicitare generică fetch.
Sec-Fetch-Dest este un semnal util, dar nu reprezintă o frontieră de securitate: este transmis doar de browserele moderne, iar clienții non-browser — cum ar fi curl, roboții (bots), anumite vizualizări web (webviews) și browsere mai vechi — îl pot omite complet sau pot trimite o valoare arbitrară. Un server poate utiliza acest antet pentru jurnalizare sau pentru aplicarea rate-limiting, dar nu ar trebui să se bazeze exclusiv pe el pentru a decide dacă integrarea într-un iframe este sigură; această decizie revine totuși în sarcina lui X-Frame-Options și a CSP frame-ancestors, care sunt aplicate de către browsere independent de anteturile cererii.
Din partea clientului, o pagină poate detecta, de asemenea, că rulează în interiorul unui cadru fără niciun antet specific, de exemplu comparând `window.top !== window.self` (sau citind `window.frameElement` pentru cadre din aceeași sursă) și apoi acționând corespunzător — afișând un avertisment sau impunând o redirecționare la nivel superior (top-level). Aceasta este tehnica de protecție împotriva încadrării (frame-busting) menționată anterior și funcționează indiferent de ce valori conțin anteturile cererii.
Exemple de configurare server: blocarea încorporării iframe
Fragmentele de cod de mai jos arată cum să configurezi fiecare server sau framework pentru a bloca complet încorporarea în iframe (`X-Frame-Options: DENY` + `CSP frame-ancestors 'none'`) – cea mai restrictivă opțiune din ghidul rapid de mai sus.
server {
location / {
add_header X-Frame-Options "DENY" always;
add_header Content-Security-Policy "frame-ancestors 'none'" always;
}
}
<IfModule mod_headers.c>
Header always set X-Frame-Options "DENY"
Header always set Content-Security-Policy "frame-ancestors 'none'"
</IfModule>
app.use((req, res, next) => {
res.setHeader('X-Frame-Options', 'DENY');
res.setHeader('Content-Security-Policy', "frame-ancestors 'none'");
next();
});
// next.config.js
module.exports = {
async headers() {
return [
{
source: '/:path*',
headers: [
{ key: 'X-Frame-Options', value: 'DENY' },
{ key: 'Content-Security-Policy', value: "frame-ancestors 'none'" },
],
},
];
},
};
class SetFrameOptions
{
public function handle(Request $request, Closure $next): Response
{
$response = $next($request);
$response->headers->set('X-Frame-Options', 'DENY');
$response->headers->set('Content-Security-Policy', "frame-ancestors 'none'");
return $response;
}
}
export default {
async fetch(request) {
const response = await fetch(request);
const headers = new Headers(response.headers);
headers.set('X-Frame-Options', 'DENY');
headers.set('Content-Security-Policy', "frame-ancestors 'none'");
return new Response(response.body, { status: response.status, headers });
},
};
Ai nevoie doar să permiți site-ul tău sau o listă scurtă de permise să încorporeze pagina, în loc să blochezi pe toată lumea? Înlocuiește `DENY` cu `SAMEORIGIN`, iar `'none'` cu `'self'` sau o listă explicită de origini – restul configurației rămâne neschimbat.
Capcane / aspecte cunoscute ale platformelor
Indiferent de regulile generale ale antetelor, câteva platforme bine cunoscute au particularități proprii — aspecte pe care merită să le cunoști înainte de a presupune automat „Bloca” sau „Integrabil” bazându-te strict pe antete.
| Platformă \/ scenariu | Comportament | Motiv |
|---|---|---|
| Pagina de vizionare YouTube (youtube.com\/watch) | Bloca | Folosește în schimb URL-ul oficial al player-ului youtube.com\/embed\/{id} — pagina standard de vizionare trimite o politică restrictivă pentru integrare în iframe. |
| Pagina localizării Google Maps | Bloca | Doar URL-ul iframe din API-ul Maps Embed (google.com\/maps\/embed) este conceput pentru a fi integrat în alte site-uri. |
| Pagini de autentificare OAuth (Google \/ Microsoft) | Bloca | Blicate intenționat din 2015 pentru a preveni furtul datelor de autentificare (credential phishing) în cadrul iframelor; fluxul de login trebuie să ruleze într-o fereastră principală sau pop-up. |
| Pagini de finalizare a plății (Stripe Checkout, PayPal, majoritatea gateway-urilor bancare) | Bloca | Integrarea formularului de plată într-un iframe reprezintă un vector clasic de clickjacking, așa că procesatoarele de plăți o refuză categoric. |
| Pagini de repository \/ fișier GitHub | Bloca | Politica globală a site-ului setează `frame-ancestors` pe `'none'`; folosește în schimb API-ul REST\/GraphQL sau o captură de ecran, în loc de un iframe. |
| Pagini „Publicare pe web” Notion \/ Google Docs | Integrabil | Concepute explicit pentru integrare, iar produsele oferă deja cod de embed pregenerat. |
| Articole Wikipedia | Integrabil | Nu există X-Frame-Options\/CSP restrictive implicit, dar verifică termenii de licențiere și atribuire înainte de a realiza integrări la scară largă. |
Scenarii frecvente de utilizare
- Decide dacă un widget, un panou de control sau un document terț poate fi integrat în produsul tău înainte de a scrie codul de integrare.
- Verifică faptul că site-ul tău transmite politica X-Frame-Options sau CSP frame-ancestors pe care ai configurat-o inițial.
- Debugați protecția împotriva clickjacking-ului: înțelegeți de ce o pagină afișează `about:blank` sau un mesaj de refuz într-un iframe.
- Analizați în lot URL-urile candidate în timpul agregării conținutului sau a integrării unui portal, folosind istoricul sesiunii pentru a revedea rezultatele.
- Pregătiți-vă pentru audituri de securitate sau teste de penetrare documentând politica de utilizare a iframelor pentru dependențele externe.