So verhindern Sie, dass meine Site-Seite über den Site-Frame eines Drittanbieters von iFrame geladen wird


80

Wie kann ich feststellen, dass meine Seite beim Laden der Seite als Frame in eine andere Site eingebettet ist? Ich denke, Referrer Request Header kann mir hier nicht helfen? Vielen Dank.


Hallo John, ich kann nicht sagen, dass ich hier eine vollständige Lösung brauche. Nur die Bewegungsrichtung reicht aus. Nachdem ich eine Antwort auf meine Frage gefunden habe, poste ich sie immer als Antwort. Nur so kann ich an der Community teilnehmen.
oben

Hinweis: Das Festlegen des Meta-Tags ist nutzlos! Zum Beispiel hat <meta http-equiv = "X-Frame-Options" content = "leugnen"> keine Auswirkung. Benutze es nicht! Nur wenn Sie den HTTP-Header wie in den folgenden Beispielen verwenden, funktionieren die X-Frame-Optionen. developer.mozilla.org/fr/docs/Web/HTTP/Headers/X-Frame-Options
Hosam Elzagh

Antworten:


100

Sie können es nicht von der Serverseite aus überprüfen, aber Sie können Javascript verwenden, um es zu erkennen, nachdem die Seite geladen wurde. Vergleichen Sie topund selfwenn sie nicht identisch sind, befinden Sie sich in einem Frame.

Darüber hinaus respektieren einige moderne Browser den X-FRAME-OPTIONSHeader, der zwei Werte haben kann:

  • VERWEIGERN - verhindert, dass die Seite gerendert wird, wenn sie in einem Frame enthalten ist
  • SAMEORIGIN - wie oben, es sei denn, die Seite gehört zur selben Domain wie der Frameset-Inhaber der obersten Ebene.

Zu den Nutzern gehört Picasa von Google, das nicht in einen Frame eingebettet werden kann.

Browser, die den Header unterstützen, mit der Mindestversion:

  • IE8 und IE9
  • Opera 10.50
  • Safari 4
  • Chrome 4.1.249.1042
  • Firefox 3.6.9 (ältere Versionen mit NoScript )

2
Da ich hier über eine Google-Suche gestolpert bin, werde ich hinzufügen, dass Firefox im August 2010 X-FRAME-OPTIONS mit FF3.6.9 hinzugefügt hat: michael-coates.blogspot.com/2010/08/…
ThePants


43

Stackoverflow enthält einige JS zum Testen ( master.js). Dies ist der relevante Teil davon:

if(top!=self){
    top.location.replace(document.location);
    alert("For security reasons, framing is not allowed; click OK to remove the frames.")
}

Beachten Sie jedoch, dass JS deaktiviert werden kann.


Dieser Ansatz ist besonders nützlich, wenn Sie eine Nachricht an die Person senden möchten, die Ihren Inhalt in einen Iframe stellt, oder an den Endbenutzer der Website, der Ihren Inhalt im Iframe betrachtet.
Kevinmicke

29

Für moderne Browser können Sie CSP (Content Security Policy) verwenden, einen Standard. Der folgende Header verhindert, dass das Dokument irgendwo in einen Frame geladen wird:

Content-Security-Policy: frame-ancestors 'none'

(IE 11 benötigt jedoch das X-Präfix). Sie können auch 'none'zu dem Ursprung wechseln , an dem Framing zulässig ist, z. B. zu Ihrer eigenen Site.

Um die älteren Browser abzudecken, wird dies am besten zusammen mit der Antwort von @ Maerlyn verwendet .


1
Ihre Antwort ist bei klarem Respekt nicht klar genug. Ist das Header-Code oder PHP? Zum Beispiel.
Gary Carlyle Cook

2
@GaryCarlyleCook Dies ist ein HTTP-Header, der Teil der Antwort an den Browser sein sollte, wenn eine Seite bereitgestellt wird. Es ist kein PHP-Code, obwohl Sie PHP verwenden könnten, um ihn zu senden. siehe header ()
rvighne

15

Sie können verhindern, dass Ihre Seite in einem Iframe mit Javascript geladen wird

<script type="text/javascript">
if ( window.self !== window.top ) {
    window.top.location.href=window.location.href;
}
</script>

Dieser Code ändert die Adresse des Containers des Iframes Ihrer Seite in Ihre Seitenadresse und erzwingt, dass der Container Ihre Seite anzeigt.


1
sandboxDas Attribut on iframe erlaubt es, solche Framing-Hacks zu verbieten. Dieser Weg ist also kein sicherer Weg, um Framing zu verhindern, falls Sie Sicherheitsbedenken haben.
Frédéric

6

Oder Sie können eine bestimmte Domain blockieren, wenn Sie an einigen Orten nichts gegen Ihre Inhalte haben, diese aber nicht auf einer bestimmten Site haben möchten. Wenn Sie beispielsweise offendingdomain.comIhren Inhalt einbetten, können Sie Folgendes tun:

<script type="text/javascript">
    if(document.referrer.indexOf("offendingdomain.com") != -1) {
        window.location = "http://www.youtube.com/watch_popup?v=oHg5SJYRHA0";
    }
</script>

Dies würde den Speicherort des übergeordneten Dokuments überprüfen und feststellen, ob es der offendingdomain.comInhalt ist, der Ihren Inhalt einbettet. Dieses Skript sendet diesen Iframe dann zur Bestrafung an ein bestimmtes berühmtes Youtube-Video. Tatsächlich haben sie sich nur selbst gerollt.


3

Verwenden Sie Javascript, um zu überprüfen, ob es auf iframe geladen wurde, indem Sie das folgende Skript am Ende Ihrer PHP-Datei platzieren und zu einer Seite umleiten, die eine Warnung anzeigt oder darauf hinweist, dass Ihre Seite nicht mit iframe geladen werden sollte.

<script type="text/javascript">
if(top.location != window.location) {
    window.location = '/error_iframe.php';
}
</script>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.