iframe-Einbettungsprüfung
Kostenloser Online-iFrame-Checker: Geben Sie die URL einer beliebigen Webseite ein, um ihre Header X-Frame-Options und Content-Security-Policy frame-ancestors zu untersuchen. Ermitteln Sie, ob die Seite in ein iFrame eingebettet werden kann, und bestätigen Sie dies mit einer Live-Vorschau. Der Verlauf wird für die aktuelle Browsersitzung gespeichert.
Verlauf (diese Sitzung)
Nur in diesem Tab gespeichert (sessionStorage); wird gelöscht, wenn Sie den Tab schließen. Es werden keine Daten an Server übermittelt.
Funktionsweise des Checks
- Geben Sie die Ziel-URL ein und klicken Sie auf „Prüfen“. Der Server ruft die Seite wie eine echte iFrame-Anfrage ab (mit Sec-Fetch-Dest: iframe) und liest deren Response-Header aus.
- Das Ergebnis ergibt sich aus X-Frame-Options (DENY / SAMEORIGIN blockieren Rahmen) und Content-Security-Policy frame-ancestors (nur * oder ein Schemas-Wildcard erlaubt beliebige Drittanbieter-Eltern).
- Die gleiche URL wird im Live-iFrame geladen, sodass Sie bestätigen können, was der Browser tatsächlich tut – einschließlich JavaScript-basierter Rahmenblockierungen, die Header nicht erkennen können.
Was bestimmt, ob eine Seite eingebettet werden kann?
Ob eine Webseite in einem <iframe> auf einer anderen Website angezeigt werden kann, wird vom Browser anhand von Antwortheadern entschieden, die die Seite selbst sendet. Dieser Checker führt dieselbe Prüfung serverseitig durch und liefert Ihnen sofort ein Ergebnis.
X-Frame-Options ist der klassische Header: DENY verbietet das Einbetten in jedem Frame, SAMEORIGIN erlaubt nur Seiten aus demselben Ursprung zur Einbettung, und ALLOW-FROM wurde aus modernen Browsern entfernt. Wenn der Header fehlt, blockieren ältere Regeln die Frame-Einbettung nicht.
Content-Security-Policy frame-ancestors ist der moderne Ersatz. Er listet die Ursprünge auf, die die Seite einbetten dürfen – beispielsweise frame-ancestors 'self' https://example.com. Der Wert * (oder ein bloßes Schema wie https:) erlaubt jedes HTTPS-Parent; alles Engere blockiert Drittanbieter-Einbettung.
Header sind nicht die gesamte Geschichte: Seiten-Skripte können frame-busting-Code ausführen (Vergleich von top !== self und Erzwingen einer Top-Navigation), und Anmeldeseiten oder geobeschränkte Endpunkte können sich bei Rechenzentrumsanfragen unterschiedlich verhalten. Aus diesem Grund wird jedes Ergebnis mit einer Live-Vorschau versehen.
Kurzanleitung: Einrichtung von Response-Headern
Wenn Sie die Website besitzen, steuern Sie die Einbettung direkt über Antwortheader.
Einbettung von jeder Seite blockieren
X-Frame-Options: DENY
Content-Security-Policy: frame-ancestors 'none'
Browser verweigern die Darstellung der Seite in jedem iframe – der strengste Clickjacking-Schutz.
Nur Einbettung aus demselben Ursprung erlauben
X-Frame-Options: SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self'
Nur Seiten mit dem gleichen Schema, Host und Port dürfen sie in einem Frame einbinden; Drittseiten werden blockiert.
Nur bestimmte Ursprünge erlauben
Content-Security-Policy: frame-ancestors 'self' https://trusted.example.com
Geben Sie vertrauenswürdige Ursprünge in frame-ancestors an; nicht aufgeführte Ursprünge werden blockiert.
Einbettung von jeder Seite erlauben
X-Frame-Options nicht setzen
Content-Security-Policy: frame-ancestors *
Jede Website kann die Seite in einem iframe einbetten. Wägen Sie den Sicherheitskompromiss ab.
Hinweis: X-Frame-Options wird durch CSP frame-ancestors abgelöst. Wenn beide vorhanden sind, hat CSP Vorzug – bevorzugen Sie frame-ancestors.
Wie erkennt der Server, dass eine Anfrage von einem iFrame stammt?
Seit etwa 2020 fügen chromium- und firefox-basierte Browser automatisch eine Reihe von Fetch-Metadata-Anfrageheadern zu jeder Navigation und jeder Unterressourcenanfrage hinzu. Der nützlichste für Frame-Prüfungen ist Sec-Fetch-Dest – er teilt dem Server mit, welche Art von Kontext die Ressource angefordert hat, ohne dass die anfordernde Seite mitwirken muss.
- Sec-Fetch-Dest: document – Top-Level-Navigation, nicht in einem Frame enthalten.
- Sec-Fetch-Dest: iframe – Die Anfrage wird in einem <iframe>-Element geladen.
- Sec-Fetch-Dest: frame – In einem älteren <frame>-Element (Frameset) geladen.
- Sec-Fetch-Dest: embed/object – In einem <embed>- oder <object>-Element geladen.
Dieser Prüfer sendet seine eigene Probe mit Sec-Fetch-Dest: iframe und spiegelt damit exakt wider, was ein echter Browser beim Einbetten einer Seite sendet – das Ergebnis spiegelt also wider, wie sich der Zielserver tatsächlich bei echten iframe-Anfragen verhält, und nicht nur bei generischen Abrufanfragen.
Sec-Fetch-Dest ist ein nützliches Signal, aber keine Sicherheitsgrenze: Es wird nur von modernen Browsern gesendet, und Nicht-Browser-Clients – curl, Bots, manche Webansichten und ältere Browser – können es vollständig weglassen oder einen beliebigen Wert senden. Ein Server kann darauf basierend protokollieren oder Ratenbegrenzungen durchführen, aber niemals allein darauf vertrauen, zu entscheiden, ob Einbettung sicher ist; diese Entscheidung liegt weiterhin bei X-Frame-Options und CSP frame-ancestors, die Browser unabhängig von Anfrage-Headern durchsetzen.
Auf Client-Seite kann eine Seite auch erkennen, dass sie sich in einem iframe ohne Header befindet – z. B. durch den Vergleich window.top !== window.self (oder das Auslesen von window.frameElement bei frames gleicher Herkunft) – und dann reagieren: eine Warnung anzeigen oder eine Weiterleitung auf die oberste Ebene erzwingen. Das ist die eingangs genannte Frame-Busting-Technik, und sie funktioniert unabhängig davon, was die Anfrage-Header besagen.
Server-Konfigurationsbeispiele: IFrame-Einbindung blockieren
Die folgenden Codeausschnitte zeigen, wie Sie jeden Server oder jedes Framework konfigurieren, um iframe-Einbettung vollständig zu blockieren (X-Frame-Options: DENY + CSP frame-ancestors 'none') – die strengste Maßnahme aus der Schnellanleitung oben.
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 });
},
};
Müssen Sie stattdessen nur Ihre eigene Website oder eine kurze Zulassungsliste zur Einbettung der Seite erlauben, statt alle zu blockieren? Tauschen Sie DENY gegen SAMEORIGIN und 'none' gegen 'self' oder eine explizite Ursprungsliste aus – der Rest der Konfiguration bleibt gleich.
Bekannte Fallstricke bei Plattformen
Von allgemeinen Header-Regeln abgesehen, haben einige bekannte Plattformen eigene Besonderheiten – das ist wert zu wissen, bevor man allein anhand von Headern annimmt, dass etwas „blockiert“ oder „einbettbar“ ist.
| Plattform / Szenario | Verhalten | Grund |
|---|---|---|
| YouTube-Watch-Seite (youtube.com/watch) | Blockiert | Nutzen Sie stattdessen die offizielle Player-URL youtube.com/embed/{id} – die normale Watch-Seite sendet eine restriktive Einbettungsrichtlinie. |
| Google Maps-Ortsseite | Blockiert | Nur die iframe-URL der Maps Embed API (google.com/maps/embed) ist zur Einbettung vorgesehen. |
| Google / Microsoft OAuth-Anmeldeseiten | Blockiert | Absichtlich seit 2015 blockiert, um Anmelde-Daten-Phishing innerhalb von iframes zu verhindern; der Anmeldefluss muss in einem obersten Fenster oder Popup ablaufen. |
| Zahlungs-Kassen-Seiten (Stripe Checkout, PayPal, die meisten Bankgateways) | Blockiert | Die Einbettung eines Zahlungsformulars ist ein klassischer Clickjacking-Vektor, daher lehnen Anbieter dies kategorisch ab. |
| GitHub-Repository- / Dateiseiten | Blockiert | Seitenweite frame-ancestors 'none'; nutzen Sie stattdessen die REST-/GraphQL-API oder einen Screenshot statt eines iframes. |
| Notion / Google Docs „Im Web veröffentlichen“-Seiten | Einbettbar | Explizit zur Einbettung konzipiert, und das Produkt bietet fertigen Einbettcode an. |
| Wikipedia-Artikel | Einbettbar | Standardmäßig keine restriktiven X-Frame-Options/CSP, aber prüfen Sie die Lizenz- und Quellenangabenbedingungen, bevor Sie großflächig einbetten. |
Häufige Anwendungsfälle
- Entscheiden Sie, ob ein externes Widget, Dashboard oder Dokument in Ihr eigenes Produkt eingebettet werden kann, bevor Sie Integrationscode schreiben.
- Überprüfen Sie, ob Ihre eigene Seite die X-Frame-Options- oder CSP frame-ancestors-Richtlinie sendet, die Sie beabsichtigt haben.
- Clickjacking-Schutz debuggen: Verstehen, warum eine Seite about:blank oder eine Ablehnungsmeldung in einem iframe anzeigt.
- Kandidaten-URLs stapelweise prüfen bei der Inhaltsaggregation oder Portal-Integration, wobei die Sitzungsverlauf verwendet wird, um Ergebnisse erneut aufzurufen.
- Vorbereitung auf Sicherheitsüberprüfungen oder Penetrationstests durch Dokumentation der Framing-Richtlinie externer Abhängigkeiten.