Wie setze ich 'X-Frame-Optionen' auf iframe?

170

Wenn ich so etwas erstelle iframe:

var dialog = $('<div id="' + dialogId + '" align="center"><iframe id="' + frameId + '" src="' + url + '" width="100%" frameborder="0" height="'+frameHeightForIe8+'" data-ssotoken="' + token + '"></iframe></div>').dialog({

Wie kann ich den Fehler beheben:

Die Anzeige 'https://www.google.com.ua/?gws_rd=ssl'in einem Frame wurde abgelehnt, da "X-Frame-Optionen" auf "SAMEORIGIN" gesetzt wurde.

mit JavaScript?

Darien Fawkes
quelle

Antworten:

227

Sie können nicht X-Frame-Optionsauf die setzen iframe. Dies ist ein Antwortheader, der von der Domäne festgelegt wird, von der Sie die Ressource anfordern ( google.com.uain Ihrem Beispiel). Sie haben den Header SAMEORIGINin diesem Fall auf gesetzt, was bedeutet, dass sie das Laden der Ressource iframeaußerhalb ihrer Domäne nicht zugelassen haben. Weitere Informationen finden Sie unter Der Antwortheader "X-Frame-Options" auf MDN.

Eine schnelle Überprüfung der Header (hier in den Chrome-Entwicklertools angezeigt) zeigt den X-Frame-Optionsvom Host zurückgegebenen Wert.

Geben Sie hier die Bildbeschreibung ein

Drew Gaynor
quelle
7
Mit YouTube kannst du die Endpunkt-URL in die "Einbettungs" -Version ändern. Siehe stackoverflow.com/questions/25661182/… (Ich weiß, dass dies nicht genau das ist, wonach das OP sucht, aber Google gibt dieses Ergebnis zuerst!)
73

X-Frame-Optionsist ein Header, der in der Antwort auf die Anforderung enthalten ist, anzugeben, ob die angeforderte Domäne sich innerhalb eines Frames anzeigen lässt. Es hat nichts mit Javascript oder HTML zu tun und kann vom Absender der Anfrage nicht geändert werden.

Diese Website hat diesen Header so eingestellt, dass er nicht in einem angezeigt werden kann iframe . Ein Client kann nichts tun, um dieses Verhalten zu stoppen.

Lesen Sie weiter auf X-Frame-Optionen

Rory McCrossan
quelle
Es wird im Antwortheader festgelegt, nicht im Anforderungsheader. Aber sonst genaue Erklärung!
Nickang
2
@nickang das habe ich gemeint, aber ich stimme zu, dass die Terminologie nicht klar war. Ich habe es bearbeitet, um Verwirrung zu beseitigen. Vielen Dank.
Rory McCrossan
31

Wenn Sie die Kontrolle über den Server haben, der den Inhalt des Iframes sendet, können Sie die Einstellung für festlegen X-Frame-Options Ihren Webserver .

Apache konfigurieren

Fügen Sie Folgendes zur Konfiguration Ihrer Site hinzu, um den X-Frame-Options-Header für alle Seiten zu senden:

Header always append X-Frame-Options SAMEORIGIN

Nginx konfigurieren

Um nginx so zu konfigurieren, dass der X-Frame-Options-Header gesendet wird, fügen Sie diesen entweder Ihrer http-, Server- oder Standortkonfiguration hinzu:

add_header X-Frame-Options SAMEORIGIN;

Keine Konfiguration

Diese Header-Option ist optional. Wenn die Option überhaupt nicht festgelegt ist, können Sie sie für die nächste Instanz konfigurieren (z. B. den Besucherbrowser oder einen Proxy).

Quelle: https://developer.mozilla.org/en-US/docs/Web/HTTP/X-Frame-Options

rubo77
quelle
Das hat mir geholfen. Ich kommentiere diese beiden Zeilen aus: add_header Strict-Transport-Security "max-age=86400; includeSubdomains"; add_header X-Frame-Options DENY;aus den Nginx-Schnipsel, und dann hat es sofort funktioniert.
Zeth
NGINX, wichtig zu sagen, wo , innerhalb des Standorts?
Peter Krauss
Peter Kraus, was willst du?
Rubo77
14

Da die Lösung für die Serverseite nicht wirklich erwähnt wurde:

Man muss solche Dinge einstellen (Beispiel von Apache), dies ist nicht die beste Option, da es in allem erlaubt ist, aber nachdem Sie gesehen haben, dass Ihr Server richtig funktioniert, können Sie die Einstellungen leicht ändern.

           Header set Access-Control-Allow-Origin "*"
           Header set X-Frame-Options "allow-from *"
Mike Q.
quelle
5

nicht wirklich ... ich habe verwendet

 <system.webServer>
     <httpProtocol allowKeepAlive="true" >
       <customHeaders>
         <add name="X-Frame-Options" value="*" />
       </customHeaders>
     </httpProtocol>
 </system.webServer>
LongChalk
quelle
Das sieht nach einer Lösung aus, aber ist das eine Sicherheitsverletzung?
Yogurtu
1
Es ist keine gute Idee, dieselbe Ursprungsrichtlinie für Ihre Website zu deaktivieren, es sei denn, Sie wissen genau, was Sie tun. Sie sollten nicht zulassen, dass andere Domänen als Ihre Inhalte einbetten. Siehe codecademy.com/articles/what-is-cors und ähnliche Tutorials.
Slhck
5

Wenn nichts hilft und Sie diese Website dennoch in einem Iframe präsentieren möchten, sollten Sie die X Frame Bypass-Komponente verwenden, die einen Proxy verwendet.

Tomer Ben David
quelle
2

Der X-Frame-Options HTTP - Response - Header kann verwendet werden , um anzuzeigen , ob ein Browser erlaubt sein sollte , eine Seite in einem zu machen <frame>, <iframe>oder<object> . Websites können dies verwenden, um Clickjacking-Angriffe zu vermeiden, indem sichergestellt wird, dass ihr Inhalt nicht in andere Websites eingebettet ist.

Für mehr Informationen: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options

Ich habe eine alternative Lösung für dieses Problem, die ich mithilfe von PHP demonstrieren werde:

iframe.php:

<iframe src="target_url.php" width="925" height="2400" frameborder="0" ></iframe>

target_url.php:

<?php 
  echo file_get_contents("http://www.example.com");
?>
Shailesh Dwivedi
quelle
5
Ist dies eine praktikable Lösung, um die Seite nach dem Laden zu verwenden? Kann ich nach dem ersten Laden mit den Seiten interagieren? Müsste nicht jede Anfrage für die Domain per Proxy gesendet werden, um den Inhalt nach dem Laden verwenden zu können?
Timothy Gonzalez
0

Zu diesem Zweck müssen Sie den Speicherort in Ihrem Apache oder einem anderen von Ihnen verwendeten Dienst abgleichen

Wenn Sie Apache verwenden, dann in der Datei httpd.conf.

  <LocationMatch "/your_relative_path">
      ProxyPass absolute_path_of_your_application/your_relative_path
      ProxyPassReverse absolute_path_of_your_application/your_relative_path
   </LocationMatch>
Ibtesam Latif
quelle
0

Die Lösung besteht darin, ein Browser-Plugin zu installieren.

Eine Website, die einen HTTP-Header X-Frame-Optionsmit dem Wert DENY(oder SAMEORIGINeinem anderen Serverursprung) ausgibt, kann nicht in einen IFRAME integriert werden ... es sei denn, Sie ändern dieses Verhalten, indem Sie ein Browser-Plugin installieren, das den X-Frame-OptionsHeader ignoriert (z. B. X-Frame-Header von Chrome ignorieren) ).

Beachten Sie, dass dies aus Sicherheitsgründen überhaupt nicht empfohlen wird.

Julien Kronegg
quelle
0

Sie können die x-frame-Option in der Webkonfiguration der Site festlegen, die Sie in iframe wie folgt laden möchten

<httpProtocol>
    <customHeaders>
      <add name="X-Frame-Options" value="*" />
    </customHeaders>
  </httpProtocol>
Nikki
quelle
Wenn ich Stackoverflow öffnen möchte, wo finde ich die Webkonfiguration? ist es nicht für die Serverseite?
Irum Zahra
-1

Sie können den x-iframe nicht wirklich in Ihren HTML-Text einfügen, da er vom Websitebesitzer bereitgestellt werden muss und innerhalb der Serverregeln liegt.

Was Sie wahrscheinlich tun können, ist eine PHP-Datei zu erstellen, die den Inhalt der Ziel-URL lädt und diese PHP-URL rahmt. Dies sollte reibungslos funktionieren.

Sushant Chaudhari
quelle
1
"Sie können wahrscheinlich" dann posten Sie es als Kommentar, wenn es keine Antwort ist
MK
Was ist, wenn es sich als Antwort herausstellt? MK
Sushant Chaudhari
Dann ist es ein Vorschlag, der funktioniert hat, keine spezifische Lösung, daher sollte er als Kommentar platziert werden
MK
-2

Sie können dies in der Konfigurationsdatei auf Tomcat-Instanzebene (web.xml) tun. Sie müssen den 'Filter' und die Filterzuordnung 'in der Konfigurationsdatei web.xml hinzufügen. Dadurch werden die [X-Frame-Optionen = DENY] auf der gesamten Seite hinzugefügt, da es sich um eine globale Einstellung handelt.

<filter>
        <filter-name>httpHeaderSecurity</filter-name>
        <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
        <async-supported>true</async-supported>
        <init-param>
          <param-name>antiClickJackingEnabled</param-name>
          <param-value>true</param-value>
        </init-param>
        <init-param>
          <param-name>antiClickJackingOption</param-name>
          <param-value>DENY</param-value>
        </init-param>
    </filter>

  <filter-mapping> 
    <filter-name>httpHeaderSecurity</filter-name> 
    <url-pattern>/*</url-pattern>
</filter-mapping>
Rejji
quelle
-3

Wenn Sie dem XML-Ansatz folgen, funktioniert der folgende Code.

    <security:headers>
        <security:frame-options />
        <security:cache-control />
        <security:content-type-options />
        <security:xss-protection />
    </security:headers>
<security:http>
Bikash Pandit
quelle