wake-up-neo.net

"Anzeige durch X-Frame-Optionen verboten" überwinden

Ich schreibe eine winzige Webseite, deren Zweck es ist, ein paar andere Seiten zu rahmen, um sie einfach in einem einzigen Browserfenster zusammenzufassen, damit sie leichter angezeigt werden können. Einige der Seiten, die ich rahmen möchte, verbieten, gerahmt zu werden, und werfen den Hinweis "Dokument nicht anzeigen, da Anzeige durch X-Frame-Optionen verboten". Fehler in Chrome. Ich verstehe, dass dies eine Sicherheitsbeschränkung ist (aus gutem Grund), und habe keinen Zugriff darauf, diese zu ändern.

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

409
Garen Checkley

Ich hatte ein ähnliches Problem, bei dem ich versuchte, Inhalte von unserer eigenen Site in einem Iframe anzuzeigen (als Leuchtkasten-artiger Dialog mit Colorbox ), und bei dem wir einen serverweiten "X-Frame" hatten -Options SAMEORIGIN "-Header auf dem Quellserver, der das Laden auf unserem Testserver verhindert.

Dies scheint nirgendwo dokumentiert zu sein, aber wenn Sie die Seiten bearbeiten können, die Sie bearbeiten möchten (z. B. Ihre eigenen Seiten), wird einfach ein weiterer X-Frame-Options-Header mit einer beliebigen Zeichenfolge gesendet die Befehle SAMEORIGIN oder DENY.

z.B. für PHP setzen

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

oben auf Ihrer Seite werden Browser beide kombinieren, was zu einer Kopfzeile von führt

X-Frame-Options SAMEORIGIN, GOFORIT

... und ermöglicht es Ihnen, die Seite in einem Iframe zu laden. Dies scheint zu funktionieren, wenn der anfängliche SAMEORIGIN-Befehl auf Serverebene festgelegt wurde und Sie ihn in einer seitenweisen Groß-/Kleinschreibung überschreiben möchten.

Alles Gute!

208
Sean

Wenn Sie diesen Fehler für ein YouTube-Video erhalten, verwenden Sie anstelle der vollständigen URL die eingebettete URL aus den Freigabeoptionen. Es wird aussehen wie http://www.youtube.com/embed/eCfDxZxTBW4

Sie können watch?v= auch durch embed/ ersetzen, sodass http://www.youtube.com/watch?v=eCfDxZxTBW4 zu http://www.youtube.com/embed/eCfDxZxTBW4 wird.

158
Wil

Wenn Sie diese Fehlermeldung erhalten, während Sie versuchen, eine Google Map in iframe einzubetten, müssen Sie &output=embed zum Quelllink hinzufügen.

122
Q Studio

UPDATE 2019: Sie können X-Frame-Options in einem <iframe> mit nur client- Seite JavaScript und meine X-Frame-Bypass Web Component. Hier ist eine Demo: Hacker News in einem X-Frame-Bypass . (Getestet in Chrome & Firefox.)

55
niutech

Hinzufügen eines

  target='_top'

auf meinen Link in der Facebook-Registerkarte wurde das Problem für mich behoben ...

23
Kevin Vella

Es gibt ein Plugin für Chrome, das diesen Header-Eintrag löscht (nur für den persönlichen Gebrauch):

https://chrome.google.com/webstore/detail/ignore-x-frame-headers/gleekbfjekiniecknbkamfmkohkpodhe/reviews

21
user669677

Wenn dieser Fehler beim Einbetten von Vimeo-Inhalten auftritt, ändern Sie die Quellcode-Adresse des Iframes.

von: https://vimeo.com/63534746
bis: http://player.vimeo.com/video/63534746

20
Eric Corriel

Ich hatte das gleiche Problem, als ich versuchte, Moodle 2 in iFrame einzubetten. Die Lösung ist Site administration ► Security ► HTTP security und überprüfe Allow frame embedding.

13

Das ist die Lösung Leute !!

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

Das einzige, was für Facebook-Apps funktionierte!

7
Konst

Lösung zum Laden einer externen Website in einen iFrame, auch wenn die Option x-frame so eingestellt ist, dass sie auf der externen Website verweigert wird.

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

Das src Attribut des iFrame könnte eine URL haben, die so 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 wie ein gewöhnlicher Besuch einer Browserseite hätte sein können.

Beachten Sie: Möglicherweise möchten Sie die Sicherheit in diesem Skript verbessern. Weil Hacker möglicherweise über Ihr Proxy-Skript Webseiten laden.

6
Floris

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

  1. Erstellen Sie einen .htaccess in demselben Ordner, in dem sich Ihre PHP -Datei befindet.

  2. Diese Zeile zum htaccess hinzufügen:

    Header always unset X-Frame-Options

Das Einbetten von 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.

5
Kai Noack

Es scheint, dass X-Frame-Optionen zulassen-von https: // ... abgeschrieben und ersetzt wurde (und ignoriert wird), wenn Sie stattdessen Content-Security-Policy Header.

Hier ist die vollständige Referenz: https://content-security-policy.com/

5

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-Konfigurationsdatei.

Ich hoffe es hilft.

4
John White

FWIW:

Wir hatten eine Situation, in der wir unser iFrame töten mussten, als dieser "Breaker" -Code auftauchte. Also habe ich die PHP function get_headers($url); verwendet, um die entfernte URL auszuchecken, bevor ich sie in einer iFrame anzeigte. Um die Leistung zu verbessern, habe ich die Ergebnisse in einer Datei zwischengespeichert, sodass nicht jedes Mal eine HTTP-Verbindung hergestellt wurde.

3
Zane Claes

Ich habe Tomcat 8.0.30 verwendet. Keiner der Vorschläge hat für mich funktioniert. Da wir den X-Frame-Options aktualisieren und auf ALLOW setzen möchten, habe ich Folgendes konfiguriert, um das Einbetten von iframes zuzulassen:

  • Navigieren Sie zum Tomcat-Verzeichnis 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.
3
Giri

Die einzige Frage, die eine Reihe von Antworten hat. Willkommen bei der Anleitung, die ich mir gewünscht habe, als ich mich darum bemüht habe, dass es 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 die Canvas-Einstellungen von Facebook aufzurufen. Ich habe /canvas/ verwendet und die Route zur Haupt-SiteController für diese App gemacht:


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, die ich denke, kam aus Omniauths Beispiel.
  • Die Gem-Datei (das ist der Schlüssel !!!) stammt von: SlideShare-Dinge, 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 schrieb dieses Heroku-Handbuch , das Sie jetzt mit dieser Antwort und den Schultern der Riesen, mit denen Sie gehen, für Rails übernehmen können.
2
pjammer

target = '_ parent'

Nach der Idee von Kevin Vella habe ich versucht, dieses Attribut zu Formularelementen hinzuzufügen, die mit dem Paypal-Button-Generator erstellt wurden. Arbeitete für mich so, dass sich Paypal nicht in einem neuen Browserfenster/Tab öffnet.

2
jiminikiz

Ich bin mir nicht sicher, wie relevant es ist, aber ich habe ein Workaround dafür entwickelt. Auf meiner Site wollte ich einen Link in einem modalen Fenster anzeigen, das einen Iframe enthielt, der die URL lädt.

Ich habe das Klick-Ereignis des Links mit dieser Javascript-Funktion verknüpft. Dazu muss lediglich eine PHP -Datei angefordert werden, 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 dies überprüft:

<?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
swatkat7

Ich bin auf dieses Problem gestoßen, als ich eine wordpress - Website ausgeführt habe. Ich habe alles Mögliche versucht, um das Problem zu beheben, und war nicht sicher, wie. Letztendlich lag das Problem daran, dass ich 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, wurde jedoch maskiert, um unter http://somewebSite.com/index.html ausgeführt zu werden. Wenn ich http: //123.456.789/index.html in den Browser eingab und auf dieselben Links klickte, ergaben sich keine Probleme mit X-Frame-Ursprüngen in der JS-Konsole, sondern es wurde http : //somewebSite.com/index.html hat. Um dies richtig zu maskieren, müssen Sie die DNS-Nameserver Ihres Hosts zu Ihrem Domain-Service hinzufügen, dh godaddy.com sollte Nameserver haben, z. B. ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com mit digitalocean.com als Hosting-Service.

1
kinghenry14

Bearbeiten Sie .htaccess, wenn Sie X-Frame-Optionen aus einem gesamten Verzeichnis entfernen möchten.

Und füge die Zeile hinzu: Header deaktiviert immer die X-Frame-Optionen

[Inhalt von: Überwindung von "Anzeige durch X-Frame-Optionen verboten"

1
Nikhil Gyan

Die einzige wirkliche Antwort, wenn Sie die Header in Ihrer Quelle, die Sie in Ihrem Iframe haben möchten, nicht kontrollieren, ist, 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 dies schon jemand getan haben musste. Es war aus irgendeinem Grund nur schwer zu finden.

Ich habe endlich ein paar 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. Ansonsten 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 zuzulassen, wird Sie aber auf eine öffentliche Schamliste setzen, wenn Sie nicht zahlen und einen nicht festgelegten Betrag verwenden, von dem Sie nur entfernt werden können, wenn Sie die Gebühr zahlen ...

1
Kyle Baker

Es ist überraschend, dass niemand hier jemals die Servereinstellungen (Apache (*.conf) oder die .htaccess -Datei selbst als Ursache für diesen Fehler erwähnt hat. Durchsuchen Sie Ihre .htaccess - oder Apache -Konfigurationsdateien und stellen Sie sicher, dass Sie nicht die folgenden Einstellungen auf DENY setzen:

Header always set X-Frame-Options DENY

Wenn Sie es in SAMEORIGIN ändern, funktioniert es wie erwartet:

Header always set X-Frame-Options SAMEORIGIN

1
Ilia Rostovtsev

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
mattdlockyer

Verwenden Sie diese Zeile anstelle der Funktion header().

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

ich hatte dieses Problem und löste es Bearbeitung 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

0
Arthur

Versuchen Sie diese Sache, ich glaube nicht, dass irgendjemand dies im Thema vorgeschlagen hat, dies wird etwa 70% Ihres Problems lösen. Für einige andere Seiten müssen Sie ausrangieren.

FÜGEN Sie unten zu Ihrem iframe hinzu

sandbox = "Erlaube-Same-Origin-Erlaube-Skripte Erlaube-Popups Erlaube-Formulare"

0