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.

IFrame-Einbindungscheck

:

Prüft jede Zeile mit der gleichen Header-Prüfung und fügt sie dem Sitzungsverlauf unten hinzu. Pro Stapel sind maximal 20 URLs möglich. Es werden jeweils einige URLs gleichzeitig geprüft, um die Zielseiten nicht zu überlasten.

Geprüft: /
URL Ergebnis HTTP

Live-Vorschau

Die Header-Prüfung ist ein schneller erster Schritt, aber sie kann keine JavaScript-basierten Rahmenblockierungen erkennen: Wenn die Header „Einbettbar“ anzeigen, aber die Vorschau leer bleibt, abbricht oder eine Fehlerseite anzeigt, ist die Seite nicht sicher einbettbar. Die Live-Vorschau ist maßgeblich.

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.

Noch keine Checks in dieser Sitzung.

Funktionsweise des Checks

  1. 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.
  2. 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).
  3. 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.

FAQs

Warum bleibt eine als „Einbettbar“ gemeldete Seite in der Vorschau leer?
Die Antwortheader erlauben das Framing, aber die Seite enthält wahrscheinlich JavaScript zum Rahmenabbruch, erfordert eine Anmeldung oder Cookies oder liefert je nach Besucher unterschiedliche Inhalte. Vertrauen Sie der Vorschau.
Kann ich X-Frame-Options oder CSP umgehen?
Nein. Diese Header werden vom Browser aus Sicherheitsgründen (Clickjacking-Schutz) durchgesetzt; clientseitige Umgehungen sind unzuverlässig. Um Inhalte einzubetten, die Sie nicht kontrollieren, bitten Sie den Site-Betreiber, Ihren Ursprung in frame-ancestors auf die Whitelist zu setzen, oder verwenden Sie eine offizielle Einbettung/API-Lösung, die er anbietet.
Was ist der Unterschied zwischen DENY und SAMEORIGIN?
DENY blockiert die Seite in jedem iframe, einschließlich same-origin-Seiten; SAMEORIGIN erlaubt Framing nur durch Seiten mit gleichem Schema, Host und Port.
Speichert der Prüfer meine URLs?
Der Verlauf verbleibt nur in Ihrem eigenen Browser-Tab über sessionStorage und verschwindet, wenn der Tab geschlossen wird. Der Prüfsender ruft nur die angeforderte URL ab, um ihre Antwortheader zu lesen.
Warum liefert dieselbe URL zu unterschiedlichen Zeiten unterschiedliche Ergebnisse?
Websites können je nach Pfad, nach Weiterleitungen, je nach User-Agent oder basierend auf A/B-Tests und WAF-Regeln unterschiedliche Header senden. Führen Sie die Prüfung erneut aus, um den aktuellen Zustand zu erhalten.