Superamento di “Visualizzazione vietata da X-Frame-Options”

Sto scrivendo una piccola pagina web il cui scopo è quello di inquadrare poche altre pagine, semplicemente per consolidarle in un’unica finestra del browser per facilitare la visualizzazione. Alcune delle pagine che sto cercando di incorniciare non sono incorniciate e lanciano un “Rifiutato di visualizzare il documento perché visualizzato vietato da X-Frame-Options”. errore in Chrome. Capisco che questa è una limitazione di sicurezza (per una buona ragione) e non ho accesso per cambiarla.

Esiste un metodo alternativo di framing o non-frame per visualizzare le pagine all’interno di una singola finestra che non verranno tralasciate dall’intestazione X-Frame-Options?

Ho avuto un problema simile, in cui stavo cercando di visualizzare il contenuto del nostro sito in un iframe (come una finestra di dialogo in stile lightbox con Colorbox ) e in cui avevamo un’intestazione “X-Frame-Options SAMEORIGIN” a livello di server sul server di origine che impedisce il caricamento sul nostro server di test.

Questo non sembra essere documentato da nessuna parte, ma se puoi modificare le pagine che stai cercando di iframe (ad esempio, sono le tue pagine), semplicemente inviando un’altra intestazione X-Frame-Options con qualsiasi stringa a tutte le disabilita i comandi SAMEORIGIN o DENY.

per esempio. per PHP, mettendo

 

nella parte superiore della pagina, i browser combineranno i due, il risultato sarà un’intestazione di

 X-Frame-Options SAMEORIGIN, GOFORIT 

… e ti permette di caricare la pagina in un iframe. Questo sembra funzionare quando il comando SAMEORIGIN iniziale è stato impostato a livello di server e desideri sovrascriverlo in un caso pagina per pagina.

Ti auguro il meglio!

Se ricevi questo errore per un video di YouTube, anziché utilizzare l’URL completo, utilizza l’url di incorporamento dalle opzioni di condivisione. Sembrerà http://www.youtube.com/embed/eCfDxZxTBW4

Puoi anche sostituire watch?v= con embed/ così http://www.youtube.com/watch?v=eCfDxZxTBW4 diventa http://www.youtube.com/embed/eCfDxZxTBW4

Se ricevi questo errore durante il tentativo di incorporare una mappa di Google in un iframe , devi aggiungere &output=embed al link di origine.

Puoi bypassare X-Frame-Options in un usando solo JavaScript e YQL sul lato client. Ecco una dimostrazione del concetto: Hacker News in un . (Testato in Chrome e Firefox; se non funziona, prova ad aggiornare la pagina.)

Il processo è il seguente:

  1. Richiedi un URL iframe da YQL (funzione loadURL ),
  2. Ottieni dati HTML da YQL (funzione getData ),
  3. Aggiungi un e uno carica i collegamenti in un iframe usando anche YQL,
  4. Inietti questo codice HTML in un vuoto (funzione loadHTML ).

Il codice JS di esempio:

 var iframe = document.getElementsByTagName('iframe')[0]; var url = iframe.src; var getData = function (data) { if (data && data.query && data.query.results && data.query.results.resources && data.query.results.resources.content && data.query.results.resources.status == 200) loadHTML(data.query.results.resources.content); else if (data && data.error && data.error.description) loadHTML(data.error.description); else loadHTML('Error: Cannot load ' + url); }; var loadURL = function (src) { url = src; var script = document.createElement('script'); script.src = 'https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20data.headers%20where%20url%3D%22' + encodeURIComponent(url) + '%22&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=getData'; document.body.appendChild(script); }; var loadHTML = function (html) { iframe.src = 'about:blank'; iframe.contentWindow.document.open(); iframe.contentWindow.document.write(html.replace(//i, 'document.addEventListener("click", function(e) { if(e.target && e.target.nodeName == "A") { e.preventDefault(); parent.loadURL(e.target.href); } });')); iframe.contentWindow.document.close(); } loadURL(iframe.src); 

Aggiungere un

  target='_top' 

al mio link nella scheda di Facebook ho risolto il problema per me …

Se ricevi questo errore cercando di incorporare il contenuto di Vimeo, cambia l’src dell’iframe,

da: https://vimeo.com/63534746
a: http://player.vimeo.com/video/63534746

C’è un plug-in per Chrome, che rilascia la voce di intestazione (solo per uso personale):

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

Ho avuto lo stesso problema quando ho provato a incorporare moodle 2 in iframe, la soluzione è Site administration ► Security ► HTTP security e selezionare Allow frame embedding

Questa è la soluzione ragazzi !!

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

L’unica cosa che ha funzionato per le app di Facebook!

Ho provato quasi tutti i suggerimenti. Tuttavia, l’unica cosa che ha veramente risolto il problema è stata:

  1. Crea un .htaccess nella stessa cartella in cui si trova il tuo file PHP.

  2. Aggiungi questa linea all’htaccess:

    Header always unset X-Frame-Options

L’incorporamento del PHP da un iframe da un altro dominio dovrebbe funzionare in seguito.

Inoltre puoi aggiungere all’inizio del tuo file PHP:

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

Quale, tuttavia, non era necessario nel mio caso.

Sembra che X-Frame-Options-Allow-https: // … sia deprezzato e sia stato sostituito (e venga ignorato) se si utilizza invece l’intestazione Content-Security-Policy .

Ecco il riferimento completo: https://content-security-policy.com/

Ho avuto lo stesso problema con mediawiki, questo perché il server ha negato l’incorporamento della pagina in un iframe per motivi di sicurezza.

L’ho risolto scrivendo

 $wgEditPageFrameOptions = "SAMEORIGIN"; 

nel file di configurazione php mediawiki.

Spero che sia d’aiuto.

Soluzione per caricare un sito Web esterno in un iFrame anche se l’opzione x-frame è impostata per negare sul sito esterno.

Se si desidera caricare un altro sito Web in un iFrame e si ottiene l’errore Display forbidden by X-Frame-Options” è ansible superarlo creando uno script proxy lato server.

L’attributo src dell’iFrame potrebbe avere un URL simile a questo: /proxy.php?url=https://www.example.com/page&key=somekey

Quindi proxy.php sarebbe simile a qualcosa:

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

Questo passa il blocco, perché è solo una richiesta GET che potrebbe essere stata una normale visita della pagina del browser.

Attenzione: potresti voler migliorare la sicurezza in questo script. Perché gli hacker potrebbero iniziare a caricare nelle pagine web tramite il tuo script proxy.

L’unica domanda che ha un sacco di risposte. Vieni alla guida che vorrei avere quando stavo cercando di farlo funzionare alle 10:30 di sera del giorno della scadenza … FB fa alcune cose strane con le app di canvas e, beh, sei stato avvisato. Se sei ancora qui e hai un’app Rails che apparirà dietro una canvas di Facebook, avrai bisogno di:

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

Hai bisogno di un controller per chiamare dalle impostazioni della canvas di Facebook, ho usato /canvas/ e ho fatto il percorso per il principale SiteController per questa app:

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

fonti

  • La configurazione che penso proviene dall'esempio di omniauth.
  • Il file gem (che è la chiave !!!) proviene da: slideshare cose che ho imparato ...
  • Questa domanda di stack aveva l'intero angolo di Xframe, quindi otterrai uno spazio vuoto se non inserisci questa intestazione nel controller dell'app.
  • E il mio uomo @rafmagana ha scritto questa guida di heroku , che ora puoi adottare per le rotaie con questa risposta e le spalle dei giganti con cui cammini.

target = ‘_ parent’

Usando l’idea di Kevin Vella, ho provato ad aggiungere quell’attributo per formare elementi creati dal generatore di pulsanti di PayPal. Ha funzionato per me in modo che Paypal non si apra in una nuova finestra / scheda del browser.

FWIW:

Avevamo una situazione in cui dovevamo uccidere il nostro iFrame quando è apparso questo codice “breaker”. Quindi, ho usato la function get_headers($url); PHP function get_headers($url); per verificare l’URL remoto prima di mostrarlo in un iFrame . Per prestazioni migliori, ho memorizzato i risultati in un file, quindi non stavo effettuando una connessione HTTP ogni volta.

Stavo usando Tomcat 8.0.30, nessuno dei suggerimenti ha funzionato per me. Poiché stiamo cercando di aggiornare X-Frame-Options e impostarlo su ALLOW , ecco come sono configurato per consentire iframe di embed:

  • Passare alla directory conf di Tomcat, modificare il file web.xml
  • Aggiungi il filtro qui sotto:
  httpHeaderSecurity org.apache.catalina.filters.HttpHeaderSecurityFilter  hstsEnabled true   antiClickJackingEnabled true   antiClickJackingOption ALLOW-FROM  true   httpHeaderSecurity /* REQUEST  
  • Riavvia il servizio Tomcat
  • Accedi alle risorse usando un iFrame.

Non sono sicuro di quanto sia importante, ma ho costruito un work-around per questo. Sul mio sito, volevo visualizzare il link in una finestra modale che conteneva un iframe che carica l’URL.

Quello che ho fatto è che ho collegato l’evento click del link a questa funzione javascript. Tutto ciò è effettuare una richiesta a un file PHP che controlla le intestazioni URL per X-FRAME-Options prima di decidere se caricare l’URL all’interno della finestra modale o redirect.

Ecco la funzione:

  function opentheater(link, title){ $.get( "url_origin_helper.php?url="+encodeURIComponent(link), function( data ) { if(data == "ya"){ $(".modal-title").html("

"+title+"   "+link+"

"); $("#linkcontent").attr("src", link); $("#myModal").modal("show"); } else{ window.location.href = link; //alert(data); } }); }

Ecco il codice del file PHP che lo controlla:

  

Spero che questo ti aiuti.

Mi sono imbattuto in questo problema durante l’esecuzione di un sito web wordpress. Ho provato ogni sorta di cose per risolverlo e non ero sicuro di come, in definitiva, il problema era dovuto al fatto che stavo usando l’inoltro DNS con il mascheramento e che i collegamenti a siti esterni non venivano affrontati correttamente. cioè il mio sito è stato ospitato all’indirizzo http: //123.456.789/index.html ma è stato mascherato per essere eseguito su http://somewebSite.com/index.html . Quando ho inserito http: //123.456.789/index.html nel browser, facendo clic su quegli stessi link non si sono verificati problemi con X-frame-origins nella console JS, ma l’esecuzione di http://somewebSite.com/index.html ha fatto . Per mascherare correttamente devi aggiungere i server dei nomi DNS del tuo host al tuo servizio di dominio, ad esempio godaddy.com dovrebbe avere server dei nomi di esempio, ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com, se tu fossi usando digitalocean.com come servizio di hosting.

È sorprendente che nessuno qui abbia mai menzionato le impostazioni del server Apache ( *.conf ) o il file .htaccess come causa di questo errore. Cerca tra i tuoi .htaccess configurazione .htaccess o Apache , assicurandoti di non avere il seguente set su DENY :

Header always set X-Frame-Options DENY

Cambiarlo in SAMEORIGIN , fa funzionare le cose come previsto:

Header always set X-Frame-Options SAMEORIGIN

L’unica vera risposta, se non controlli le intestazioni sulla tua fonte che vuoi nel tuo iframe, è quella di delegarlo. Avere un server come client, ricevere l’origine, rimuovere le intestazioni problematiche, aggiungere CORS se necessario, quindi eseguire il ping sul proprio server.

C’è un’altra risposta che spiega come scrivere un tale proxy. Non è difficile, ma ero sicuro che qualcuno avrebbe dovuto farlo prima. Era solo difficile trovarlo, per qualche ragione.

Alla fine ho trovato alcune fonti:

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

^ preferito. Se hai bisogno di un uso raro, penso che tu possa semplicemente usare la sua app di heroku. In caso contrario, è il codice per eseguirlo sul proprio server. Nota bene quali sono i limiti.

whateverorigin.org

^ seconda scelta, ma piuttosto vecchia. Scelta presumibilmente più recente in python: https://github.com/Eiledon/alloworigin

poi c’è la terza scelta:

http://anyorigin.com/

Il che sembra consentire un po ‘di utilizzo gratuito, ma ti metterà in una lista pubblica di vergogna se non paghi e usi un importo non specificato, da cui puoi essere rimosso solo se paghi la tassa …

Non menzionato ma può aiutare in alcuni casi:

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

Utilizzare questa riga fornita di seguito anziché la funzione header() .

 echo ""; 

Ho avuto questo problema e ho risolto la modifica di httd.conf

  = 2.4.7 > Header always setifempty X-Frame-Options GOFORIT   Header always merge X-Frame-Options GOFORIT   

Ho cambiato SAMEORIGIN in GOFORIT e ho riavviato il server

Prova questa cosa, non penso che qualcuno abbia suggerito questo argomento, questo si risolverà come il 70% del tuo problema, per alcune altre pagine, devi rottamare, ho la soluzione completa ma non per il pubblico,

AGGIUNGI sotto al tuo iframe

sandbox = “allow-same-source permessi-script allow-popups allow-forms”