Überwindung von "Anzeige durch X-Frame-Optionen verboten"


418

Ich schreibe eine winzige Webseite, deren Zweck darin besteht, einige andere Seiten einzurahmen, um sie einfach in einem einzigen Browserfenster zu konsolidieren und die Anzeige zu vereinfachen. Einige der Seiten, die ich zu rahmen versuche, verbieten das Einrahmen und werfen ein "Dokument kann nicht angezeigt werden, da die Anzeige durch X-Frame-Optionen verboten ist". Fehler in Chrome. Ich verstehe, dass dies eine Sicherheitsbeschränkung ist (aus gutem Grund) und habe keinen Zugriff darauf, sie zu ändern.

Gibt es eine alternative Framing- oder Non-Framing-Methode zum Anzeigen von Seiten in einem einzelnen Fenster, die nicht durch den X-Frame-Options-Header ausgelöst werden?


117
Wenn es sich um Ihre Seiten handelt, entfernen Sie den Rahmenbegrenzer. Andernfalls respektieren Sie die Wünsche des Autors der Seite und rahmen Sie sie nicht ein.
Marc B

Wenn Sie diesen Fehler für eine Facebook-App erhalten und AJAX-Anrufe verwenden, habe ich irgendwo gelesen, dass Facebook es wirklich mag, # Tags für seinen Ajax-Kontakt zu verwenden. Versuchen Sie also, die Links zu ändern, was für mich funktioniert hat.
Eric.itzhak

28
@MarcB Chrome und Firefox rahmen ethisch einwandfreie Websites in nativem UI-Chrome ein. Diese Programme ermöglichen ihren Eigentümern, FWIW, auch lockere Richtlinien für denselben Ursprung. Wie garen-checkly sagte: "Ich schreibe eine winzige Webseite, deren Zweck es ist, ein paar andere Seiten einzurahmen, um sie einfach in einem einzigen Browserfenster zu konsolidieren, um die Anzeige zu vereinfachen." Das erweitert im Grunde den Webbrowser und wäre völlig ethisch. Die angegebene Absicht unterscheidet sich nicht vom Schreiben eines Bash-Skripts zum Öffnen und Anordnen von Browserfenstern.
Samuel Danielson

1
Überprüfen Sie Surfly . Es kann genau das tun, was Sie brauchen.
Muodov

1
@MarcB Das ist nicht hilfreich. OP kümmert sich möglicherweise nicht um die Wünsche des Seitenautors.
Flarn2006

Antworten:


211

Ich hatte ein ähnliches Problem, bei dem ich versuchte, Inhalte von unserer eigenen Site in einem Iframe anzuzeigen (als Dialog im Lightbox-Stil mit Colorbox ), und bei dem wir einen serverweiten "X-Frame-Options SAMEORIGIN" -Header auf dem hatten Quellserver verhindert, dass es auf unseren Testserver geladen wird.

Dies scheint nirgendwo dokumentiert zu sein, aber wenn Sie die Seiten bearbeiten können, die Sie iframe möchten (z. B. sind es Ihre eigenen Seiten), senden Sie einfach einen weiteren X-Frame-Options-Header mit einer beliebigen Zeichenfolge die Befehle SAMEORIGIN oder DENY.

z.B. für PHP setzen

<?php
    header('X-Frame-Options: GOFORIT'); 
?>

Oben auf Ihrer Seite werden die Browser die beiden kombinieren, was zu einer Überschrift von führt

X-Frame-Options SAMEORIGIN, GOFORIT

... und ermöglicht es Ihnen, die Seite in einen Iframe zu laden. Dies scheint zu funktionieren, wenn der ursprüngliche Befehl SAMEORIGIN auf Serverebene festgelegt wurde und Sie ihn seitenweise überschreiben möchten.

Alles Gute!


3
Ich hatte einen Rahmen um eine Website. Auf meiner Website leite ich für OAUTH zu Instagram weiter. Da Instagram sendet, X-Frame-Options: SAMEORIGINgibt es keine Möglichkeit, dies innerhalb des Frames zu tun. Sie müssen ein Popup verwenden.
Steve Tauber

16
Mit PHP ist es wahrscheinlich besser, die neue header_removeFunktion zu verwenden, sofern Sie sie zur Verfügung haben (> = 5.3.0).
eine Katze

11
Oder Sie können .htaccess bearbeiten, wenn Sie X-Frame-Optionen aus einem gesamten Verzeichnis entfernen möchten. Fügen Sie einfach die Zeile hinzu:Header always unset X-Frame-Options
Jay

4
@cawecoy: Nun ja, der springende Punkt ist, dass es ungültig ist. Es basiert darauf, dass Browser den ungültigen Header ignorieren und "fehlgeschlagen öffnen". Dies ist ein nicht angegebenes Verhalten und ziemlich zweifelhaft, auf das man sich verlassen kann. GOFORIT(oder ein anderes zufälliges willkürliches ungültiges Token) verletzt absichtlich eine Sicherheitsmaßnahme, die von einem Server angewendet wird; Wenn Sie selbst die Kontrolle über den Server haben (was Sie für einen echten öffentlichen Dienst tun sollten), müssen Sie nur den Server so einstellen, dass der Header nicht an erster Stelle gesetzt wird.
Bobince

31
Dies scheint in Chrome nicht mehr zu funktionieren. Ungültige Werte führen dazu, dass der Wert standardmäßig DENY lautet.
Jamesfm

159

Wenn Sie diesen Fehler für ein YouTube-Video erhalten, verwenden Sie die eingebettete URL aus den Freigabeoptionen, anstatt die vollständige URL zu verwenden. Es wird so aussehenhttp://www.youtube.com/embed/eCfDxZxTBW4

Sie können ersetzen auch watch?v=mit embed/so http://www.youtube.com/watch?v=eCfDxZxTBW4wirdhttp://www.youtube.com/embed/eCfDxZxTBW4


14
Oh Fortschritt ... Ich wünschte, sie würden uns einfach zur eingebetteten Seite weiterleiten, anstatt einen Fehler auszulösen und mich dazu zu bringen, meine Skripte neu zu schreiben!
Joeytwiddle

122

Wenn beim Versuch, eine Google Map in eine einzubetten, diese Fehlermeldung angezeigt wird iframe, müssen Sie sie dem Quelllink hinzufügen &output=embed.


120
Dies gilt nur für die Einbettung von Google Maps in einen Iframe und nicht für eine allgemeine "Lösung".
Benjamin Wohlwend

17
Ich musste eine Google-Karte in einen Leuchtkasten einbetten, damit diese "Lösung" perfekt war
yitwail

5
Wenn Sie dies mit einer Twitter-Webabsicht versuchen, vergessen Sie es. Ich habe den ganzen Tag verloren, verschiedene Lightbox-Plugins auszuprobieren, um dies herauszufinden. "Während Sie Links zu Absichten in IFRAMEs und Widgets bereitstellen können, können die resultierenden Seiten nicht in einen IFRAME geladen werden." Quelle: Twitter-Website.
Gubatron

6
Dies funktioniert nicht, wenn Sie versuchen, den iframe src zu laden, nachdem der Rest der Seite geladen wurde, auch wenn Sie hinzufügen&output=embed
pathfinder

1
@pathfinder Dies funktionierte für mich, als ich Probleme beim Laden des iframe src hatte, nachdem die Seite geladen wurde
David Sykes

60

UPDATE 2019: Sie könnenX-Frame-Options ein <iframe>nur clientseitiges JavaScript und meine X-Frame-Bypass-Webkomponente umgehen . Hier ist eine Demo: Hacker News in einemX-Frame-Bypass . (Getestet in Chrome & Firefox.)


3
Das ist eine interessante Problemumgehung. Funktioniert gut in FF / Chrome / Opera, funktioniert aber nicht in IE / Edge. Wer weiß was was will?
Sammler

7
Das funktioniert nicht mehr. Es gibt "Weigerte sich, ' news.ycombinator.com ' in einem Frame anzuzeigen, weil es 'X-Frame-Options' auf 'DENY' gesetzt hat." wie erwartet
g.pickardou

2
@ g.pickardou Es funktioniert für mich in Google Chrome 46, ich kann Hacker News in einem Iframe sehen.
Niutech

1
@niutech, dass Geige funktioniert, nachdem die Seite in Chrome 64 neu geladen wurde, aber wenn ich die Seite zum ersten Mal lade, funktioniert es nicht. (Versuchen Sie es inkognito.)
Carl Walsh

1
Danke, das ist großartig!
Andrew Gans

23

Hinzufügen von a

  target='_top'

Zu meinem Link auf der Facebook-Registerkarte wurde das Problem für mich behoben ...


1
Ich hatte das gleiche Problem mit dem Paypal-Iframe, der in einem anderen Iframe enthalten war. Es funktioniert jetzt! Vielen Dank
Fabrizio Fortino

4
Ich habe auch target = '_ top' hinzugefügt, aber das Problem bei dieser Lösung ist, dass der Link jetzt außerhalb des Iframes in einem neuen Tab ohne Facebook-Zeichenfläche geöffnet wird.
Sumitkanoje



13

Ich hatte das gleiche Problem, als ich versuchte, Moodle 2 in Iframe einzubetten. Lösung ist Site administration ► Security ► HTTP securityund überprüfenAllow frame embedding


Gut gemacht für die Moodle-Methode, da die anderen Methoden fehlschlagen / überschrieben werden.
Ericosg

7

Das ist die Lösung Jungs !!

FB.Event.subscribe('edge.create', function(response) {
    window.top.location.href = 'url';
});

Das einzige, was für Facebook-Apps funktioniert hat!



6

Lösung zum Laden einer externen Website in einen iFrame, selbst wenn die Option x-frame auf der externen Website verweigert wird.

Wenn Sie eine andere Website in einen iFrame laden möchten und die Display forbidden by X-Frame-Options”Fehlermeldung angezeigt wird , können Sie dies tatsächlich beheben, indem Sie ein serverseitiges Proxy-Skript erstellen.

Das srcAttribut des iFrame könnte eine URL haben, die folgendermaßen aussieht:/proxy.php?url=https://www.example.com/page&key=somekey

Dann würde proxy.php ungefähr so ​​aussehen:

if (isValidRequest()) {
   echo file_get_contents($_GET['url']);
}

function isValidRequest() {
    return $_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['key']) && 
    $_GET['key'] === 'somekey';
}

Dies umgeht den Block, da es sich nur um eine GET-Anforderung handelt, die genauso gut ein gewöhnlicher Besuch einer Browserseite gewesen sein könnte.

Beachten Sie: Möglicherweise möchten Sie die Sicherheit in diesem Skript verbessern. Weil Hacker über Ihr Proxy-Skript auf Webseiten geladen werden könnten.


Ich habe dies vor einigen Wochen getan und alle relativen URLs, die auf der externen Seite verwendet werden, funktionieren bei Verwendung von Echo nicht. (In der Regel CSS und / oder JS, sodass Sie möglicherweise nicht die volle Funktionalität erhalten, wenn Sie die URLs nicht vor dem Echo ändern.) Es sei denn, ich habe etwas verpasst ...,
ultrageek

Ich bin mir nicht sicher, warum dies bei Ihnen passiert ... Es sollte wie eine normale HTTP-Anforderung funktionieren, genau wie ein Endbenutzer beim Besuch der URL. Das Ergebnis von get_file_contents () sollte also eine vollständig funktionierende HTML-Seite sein.
Floris

5

Ich habe fast alle Vorschläge ausprobiert. Das einzige, was das Problem wirklich löste, war:

  1. Erstellen Sie eine .htaccessin demselben Ordner, in dem sich Ihre PHP-Datei befindet.

  2. Fügen Sie diese Zeile zum htaccess hinzu:

    Header always unset X-Frame-Options

Das Einbetten des PHP durch einen Iframe aus einer anderen Domäne sollte danach funktionieren.

Zusätzlich können Sie am Anfang Ihrer PHP-Datei Folgendes hinzufügen:

header('X-Frame-Options: ALLOW');

Was in meinem Fall jedoch nicht notwendig war.


Header immer deaktiviert X-Frame-Optionen in htaccess hat den Trick für mich
getan

4

Ich hatte das gleiche Problem mit mediawiki, weil der Server aus Sicherheitsgründen das Einbetten der Seite in einen Iframe verweigerte.

Ich habe es schriftlich gelöst

$wgEditPageFrameOptions = "SAMEORIGIN"; 

in die mediawiki php config datei.

Ich hoffe es hilft.


3

FWIW:

Wir hatten eine Situation, in der wir unsere töten mussten, iFrameals dieser "Breaker" -Code auftauchte. Also habe ich PHP verwendet function get_headers($url);, um die Remote-URL zu überprüfen, bevor ich sie in einem anzeige iFrame. Für eine bessere Leistung habe ich die Ergebnisse in einer Datei zwischengespeichert, sodass ich nicht jedes Mal eine HTTP-Verbindung herstellte.


3

Ich habe Tomcat 8.0.30 verwendet, keiner der Vorschläge hat für mich funktioniert. Da wir das aktualisieren X-Frame-Optionsund auf einstellen ALLOWmöchten, habe ich Folgendes so konfiguriert, dass eingebettete Iframes zugelassen werden:

  • Navigieren Sie zum Verzeichnis Tomcat conf und bearbeiten Sie die Datei web.xml
  • Fügen Sie den folgenden Filter hinzu:
<filter>
            <filter-name>httpHeaderSecurity</filter-name>
            <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
                   <init-param>
                           <param-name>hstsEnabled</param-name>
                           <param-value>true</param-value>
                   </init-param>
                   <init-param>
                           <param-name>antiClickJackingEnabled</param-name>
                           <param-value>true</param-value>
                   </init-param>
                   <init-param>
                           <param-name>antiClickJackingOption</param-name>
                           <param-value>ALLOW-FROM</param-value>
                   </init-param>
            <async-supported>true</async-supported>
       </filter>

       <filter-mapping>
                   <filter-name>httpHeaderSecurity</filter-name>
                   <url-pattern>/*</url-pattern>
                   <dispatcher>REQUEST</dispatcher>
       </filter-mapping> 
  • Starten Sie den Tomcat-Dienst neu
  • Greifen Sie mit einem iFrame auf die Ressourcen zu.

2

Die einzige Frage, die eine Reihe von Antworten hat. Willkommen bei dem Leitfaden, den ich mir gewünscht habe, als ich mich darum bemüht habe, dass er am Stichtag um 10:30 Uhr nachts funktioniert ... FB macht einige seltsame Dinge mit Canvas-Apps, und nun, Sie wurden gewarnt. Wenn Sie noch hier sind und eine Rails-App haben, die hinter einem Facebook-Canvas angezeigt wird, benötigen Sie:

Gemfile:

gem "rack-facebook-signed-request", :git => 'git://github.com/cmer/rack-facebook-signed-request.git'

config / facebook.yml

facebook:
  key: "123123123123"
  secret: "123123123123123123secret12312"

config / application.rb

config.middleware.use Rack::Facebook::SignedRequest, app_id: "123123123123", secret: "123123123123123123secret12312", inject_facebook: false

config / initializers / omniauth.rb

OmniAuth.config.logger = Rails.logger
SERVICES = YAML.load(File.open("#{::Rails.root}/config/oauth.yml").read)
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook, SERVICES['facebook']['key'], SERVICES['facebook']['secret'], iframe:   true
end

application_controller.rb

before_filter :add_xframe
def add_xframe
  headers['X-Frame-Options'] = 'GOFORIT'
end

Sie benötigen einen Controller, um über die Canvas-Einstellungen von Facebook aufzurufen. Ich /canvas/habe die Route SiteControllerfür diese App als Hauptroute verwendet :


class SiteController < ApplicationController
  def index
    @user = User.new
  end
  def canvas
    redirect_to '/auth/failure' if request.params['error'] == 'access_denied'
    url = params['code'] ? "/auth/facebook?signed_request=#{params['signed_request']}&state=canvas" : "/login"
    redirect_to url
  end
  def login
  end
end

login.html.erb


<% content_for :javascript do %>
  var oauth_url = 'https://www.facebook.com/dialog/oauth/';
  oauth_url += '?client_id=471466299609256';
  oauth_url += '&redirect_uri=' + encodeURIComponent('https://apps.facebook.com/wellbeingtracker/');
  oauth_url += '&scope=email,status_update,publish_stream';
console.log(oauth_url);
  top.location.href = oauth_url;
<% end %>

Quellen

  • Die Konfiguration stammt meiner Meinung nach aus Omniauths Beispiel.
  • Die Gem-Datei (was der Schlüssel ist !!!) stammt von: Slideshare-Dingen, die ich gelernt habe ...
  • Diese Stapelfrage hatte den gesamten Xframe-Winkel, sodass Sie ein Leerzeichen erhalten, wenn Sie diesen Header nicht in den App-Controller einfügen.
  • Und mein Mann @rafmagana hat diesen Heroku-Leitfaden geschrieben , den Sie jetzt mit dieser Antwort und den Schultern der Riesen, mit denen Sie gehen, für Schienen übernehmen können.

2

target = '_ parent'

Mit Kevin Vellas Idee habe ich versucht, dieses Attribut hinzuzufügen, um Elemente zu bilden, die mit dem PayPal-Schaltflächengenerator erstellt wurden. Hat für mich funktioniert, damit Paypal nicht in einem neuen Browserfenster / Tab geöffnet wird.


Leider scheint dies auch für Safari nicht zu funktionieren.
Wtower

1

Ich bin mir nicht sicher, wie relevant es ist, aber ich habe eine Lösung dafür gefunden. Auf meiner Site wollte ich einen Link in einem modalen Fenster anzeigen, das einen Iframe enthält, der die URL lädt.

Ich habe das Klickereignis des Links mit dieser Javascript-Funktion verknüpft. Dies erfordert lediglich eine Anforderung an eine PHP-Datei, die die URL-Header auf X-FRAME-Optionen überprüft, bevor entschieden wird, ob die URL im modalen Fenster geladen oder umgeleitet werden soll.

Hier ist die Funktion:

  function opentheater(link, title){
        $.get( "url_origin_helper.php?url="+encodeURIComponent(link), function( data ) {
  if(data == "ya"){
      $(".modal-title").html("<h3 style='color:480060;'>"+title+"&nbsp;&nbsp;&nbsp;<small>"+link+"</small></h3>");
        $("#linkcontent").attr("src", link);
        $("#myModal").modal("show");
  }
  else{
      window.location.href = link;
      //alert(data);
  }
});


        }

Hier ist der PHP-Dateicode, der danach sucht:

<?php
$url = rawurldecode($_REQUEST['url']);
$header = get_headers($url, 1);
if(array_key_exists("X-Frame-Options", $header)){
    echo "nein";
}
else{
    echo "ya";
}


?>

Hoffe das hilft.


1

Ich bin auf dieses Problem gestoßen, als ich eine WordPress-Website betrieben habe. Ich habe alle möglichen Dinge versucht, um das Problem zu beheben, und war mir nicht sicher, wie. Letztendlich lag das Problem daran, dass ich die DNS-Weiterleitung mit Maskierung verwendete und die Links zu externen Websites nicht richtig angesprochen wurden. Das heißt, meine Website wurde unter http: //123.456.789/index.html gehostet, aber für die Ausführung unter http://somewebSite.com/index.html maskiert . Als ich im Browser http: //123.456.789/index.html eingab und auf dieselben Links klickte, gab es keine Probleme mit X-Frame-Ursprüngen in der JS-Konsole, aber die Ausführung von http://somewebSite.com/index.htmltat. Um richtig zu maskieren, müssen Sie die DNS-Nameserver Ihres Hosts zu Ihrem Domänendienst hinzufügen, dh godaddy.com sollte Nameserver haben, z. B. ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com, falls Sie dies waren Verwenden von digitalocean.com als Hosting-Service.


1
remove_action( 'admin_init', 'send_frame_options_header',10);
Am

1

Es ist überraschend, dass hier niemand Apachedie Servereinstellungen ( *.confDateien) oder die .htaccessDatei selbst als Ursache für diesen Fehler erwähnt hat. Durchsuchen Sie Ihre .htaccessoder ApacheKonfigurationsdateien und stellen Sie sicher, dass Sie nicht Folgendes eingestellt haben DENY:

Header always set X-Frame-Options DENY

Wenn Sie es ändern SAMEORIGIN, funktionieren die Dinge wie erwartet:

Header always set X-Frame-Options SAMEORIGIN


es wurde bereits erwähnt - siehe den Kommentar von @Jay auf der Antwort stackoverflow.com/a/6767901/1875965
Sandra

Ich konfiguriere .conf Datei Header immer X-Frame-Optionen SAMEORIGIN gesetzt!
GeekHades

Aber wie ist dies relevant für die Frage hier, wo der Header von fremden Servern direkt zum Client kommt , IOW Ihr eigener Server ist nicht einmal beteiligt? Vermisse ich etwas
Gr.

1

Die einzige wirkliche Antwort, wenn Sie die Header Ihrer Quelle, die Sie in Ihrem Iframe haben möchten, nicht kontrollieren, besteht darin, sie zu vertreten. Lassen Sie einen Server als Client fungieren, die Quelle empfangen, die problematischen Header entfernen, bei Bedarf CORS hinzufügen und dann Ihren eigenen Server anpingen.

Es gibt noch eine andere Antwort, die erklärt, wie man einen solchen Proxy schreibt. Es ist nicht schwierig, aber ich war mir sicher, dass jemand dies vorher getan haben musste. Es war aus irgendeinem Grund nur schwer zu finden.

Ich habe endlich einige Quellen gefunden:

https://github.com/Rob--W/cors-anywhere/#documentation

^ bevorzugt. Wenn Sie eine seltene Verwendung benötigen, können Sie einfach seine Heroku-App verwenden. Andernfalls ist es Code, um es selbst auf Ihrem eigenen Server auszuführen. Beachten Sie die Grenzwerte.

Whateverorigin.org

^ zweite Wahl, aber ziemlich alt. angeblich neuere Wahl in Python: https://github.com/Eiledon/alloworigin

dann gibt es die dritte Wahl:

http://anyorigin.com/

Das scheint eine kleine kostenlose Nutzung zu erlauben, bringt Sie aber auf eine öffentliche Schamliste, wenn Sie nicht zahlen und einen nicht festgelegten Betrag verwenden, von dem Sie nur entfernt werden können, wenn Sie die Gebühr zahlen ...


0

Nicht erwähnt, kann aber in einigen Fällen helfen:

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
    if (xhr.readyState !== 4) return;
    if (xhr.status === 200) {
        var doc = iframe.contentWindow.document;
        doc.open();
        doc.write(xhr.responseText);
        doc.close();
    }
}
xhr.open('GET', url, true);
xhr.send(null);

0

Verwenden Sie diese unten angegebene Zeile anstelle der header()Funktion.

echo "<script>window.top.location = 'https://apps.facebook.com/yourappnamespace/';</script>";

0

Ich hatte dieses Problem und löste es durch Bearbeiten von httd.conf

<IfModule headers_module>
    <IfVersion >= 2.4.7 >
        Header always setifempty X-Frame-Options GOFORIT
    </IfVersion>
    <IfVersion < 2.4.7 >
        Header always merge X-Frame-Options GOFORIT
    </IfVersion>
</IfModule>

Ich habe SAMEORIGIN in GOFORIT geändert und den Server neu gestartet


-1

Versuchen Sie dieses Ding, ich glaube nicht, dass jemand dies im Thema vorgeschlagen hat, dies wird wie 70% Ihres Problems lösen, für einige andere Seiten müssen Sie verschrotten, ich habe die vollständige Lösung, aber nicht für die Öffentlichkeit,

Fügen Sie unten zu Ihrem Iframe hinzu

sandbox = "erlaube-gleichen-Ursprungs-erlaubten-Skripten erlaube-Popups erlaube-Formulare"


1
Sandboxing reduziert Berechtigungen, fügt sie jedoch nicht hinzu. siehe html5rocks.com/de/tutorials/security/sandboxed-iframes
Kyle Baker

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.