Come impostare 'X-Frame-Options' su iframe?


170

Se creo un iframesimile come questo:

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

Come posso correggere l'errore:

Rifiutato di essere visualizzato 'https://www.google.com.ua/?gws_rd=ssl'in una cornice perché ha impostato "Opzioni X-Frame" su "SAMEORIGIN".

con JavaScript?

Risposte:


227

Non puoi impostare X-Frame-Optionssu iframe. Questa è un'intestazione di risposta impostata dal dominio da cui stai richiedendo la risorsa ( google.com.uanel tuo esempio). In SAMEORIGINquesto caso hanno impostato l'intestazione , il che significa che non hanno consentito il caricamento della risorsa iframeall'esterno del loro dominio. Per ulteriori informazioni, consultare l'intestazione della risposta X-Frame-Options su MDN.

Una rapida ispezione delle intestazioni (mostrata qui negli strumenti di sviluppo di Chrome) rivela il X-Frame-Optionsvalore restituito dall'host.

inserisci qui la descrizione dell'immagine


7
Con YouTube, puoi modificare l'URL dell'endpoint nella versione "incorpora". Vedi stackoverflow.com/questions/25661182/… (So ​​che questo non è esattamente ciò che l'OP sta cercando, ma google fornisce prima questo risultato!)

73

X-Frame-Optionsè un'intestazione inclusa nella risposta alla richiesta per indicare se il dominio richiesto si consentirà di essere visualizzato all'interno di un frame. Non ha nulla a che fare con JavaScript o HTML e non può essere modificato dall'autore della richiesta.

Questo sito Web ha impostato questa intestazione per impedirne la visualizzazione in un iframe. Non c'è niente che un client possa fare per fermare questo comportamento.

Ulteriori letture su X-Frame-Options


È impostato nell'intestazione della risposta, non nell'intestazione della richiesta. Ma spiegazione altrimenti accurata!
Nick

2
@nickang è quello che volevo dire, tuttavia sono d'accordo che la terminologia non era chiara. L'ho modificato per eliminare qualsiasi confusione. Grazie.
Rory McCrossan,

31

Nel caso in cui tu abbia il controllo del Server che invia il contenuto dell'iframe, puoi configurare l'impostazione X-Frame-Optionsnel tuo server web.

Configurare Apache

Per inviare l'intestazione X-Frame-Options per tutte le pagine, aggiungilo alla configurazione del tuo sito:

Header always append X-Frame-Options SAMEORIGIN

Configurare nginx

Per configurare nginx per inviare l'intestazione X-Frame-Options, aggiungilo alla tua configurazione http, server o posizione:

add_header X-Frame-Options SAMEORIGIN;

Nessuna configurazione

Questa opzione di intestazione è facoltativa, quindi se l'opzione non è impostata, ti verrà data la possibilità di configurarla alla prossima istanza (ad esempio il browser dei visitatori o un proxy)

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


Questo mi ha aiutato. Commento queste due righe: add_header Strict-Transport-Security "max-age=86400; includeSubdomains"; add_header X-Frame-Options DENY;dai frammenti di nginx, e poi ha funzionato immediatamente.
Zeth,

NGINX, importante dire dove , all'interno della posizione?
Peter Krauss,

Peter Kraus, cosa vuoi?
rubo77,

14

Poiché la soluzione non è stata menzionata per il lato server:

Bisogna impostare cose come questa (esempio da apache), questa non è l'opzione migliore in quanto consente in tutto, ma dopo aver visto il tuo server funzionare correttamente puoi facilmente cambiare le impostazioni.

           Header set Access-Control-Allow-Origin "*"
           Header set X-Frame-Options "allow-from *"

5

non proprio ... l'ho usato

 <system.webServer>
     <httpProtocol allowKeepAlive="true" >
       <customHeaders>
         <add name="X-Frame-Options" value="*" />
       </customHeaders>
     </httpProtocol>
 </system.webServer>

Sembra una soluzione, ma si tratta di una violazione della sicurezza?
Yogurtu,

1
E ' non è una buona idea per disabilitare la stessa politica di origine per il tuo sito se non si sa esattamente cosa si sta facendo. Non devi consentire ai domini diversi dai tuoi di incorporare contenuti. Vedi codecademy.com/articles/what-is-cors e tutorial simili.
Slhck,


2

L'intestazione della risposta HTTP X-Frame-Options può essere utilizzata per indicare se un browser deve essere autorizzato a eseguire il rendering di una pagina in a <frame>, <iframe>o <object>. I siti possono utilizzarlo per evitare attacchi di clickjacking, garantendo che il loro contenuto non sia incorporato in altri siti.

Per maggiori informazioni: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options

Ho una soluzione alternativa per questo problema, che ho intenzione di dimostrare usando PHP:

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");
?>

5
È una soluzione praticabile utilizzare la pagina dopo il caricamento? Potrò interagire con le pagine dopo il caricamento iniziale? Non è necessario sottoporre a proxy ogni richiesta per il dominio per utilizzare il contenuto dopo il caricamento?
Timothy Gonzalez,

0

A tal fine, devi abbinare la posizione nel tuo apache o qualsiasi altro servizio che stai utilizzando

Se stai usando apache, allora nel file 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>

0

La soluzione è installare un plug-in del browser.

Un sito Web che emette intestazioni HTTP X-Frame-Optionscon un valore di DENY(o SAMEORIGINcon origini server diverse) non può essere integrato in un IFRAME ... a meno che non si cambi questo comportamento installando un plug-in Browser che ignora l' X-Frame-Optionsintestazione (ad es. Ignora intestazioni X-Frame di Chrome ).

Si noti che questo non è affatto raccomandato per motivi di sicurezza.


0

puoi impostare l'opzione x-frame nella configurazione web del sito che vuoi caricare in iframe in questo modo

<httpProtocol>
    <customHeaders>
      <add name="X-Frame-Options" value="*" />
    </customHeaders>
  </httpProtocol>

se voglio aprire StackOverflow, dove posso trovare la configurazione Web? non è per il lato server?
irum zahra,

-1

Non puoi davvero aggiungere x-iframe nel tuo corpo HTML in quanto deve essere fornito dal proprietario del sito e rientra nelle regole del server.

Quello che probabilmente puoi fare è creare un file PHP che carica il contenuto dell'URL di destinazione e iframe quell'URL php, questo dovrebbe funzionare senza problemi.


1
"Probabilmente puoi" quindi pubblicalo come commento se non è una risposta
MK

E se risultasse essere una risposta MK
Sushant Chaudhari il

Quindi è un suggerimento che ha funzionato, non una soluzione specifica, quindi dovrebbe essere inserito come commento
MK

-2

puoi farlo nel file di configurazione Tomcat a livello di istanza (web.xml) devi aggiungere il 'filtro' e il filtro-mapping 'nel file di configurazione web.xml. questo aggiungerà [X-frame-options = DENY] in tutta la pagina in quanto è un'impostazione globale.

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

-3

Se stai seguendo l'approccio xml, allora il codice sottostante funzionerà.

    <security:headers>
        <security:frame-options />
        <security:cache-control />
        <security:content-type-options />
        <security:xss-protection />
    </security:headers>
<security:http>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.