2010-05-06 13 views
30

Sto sviluppando una pagina Web che deve visualizzare, in un iframe, un report servito dal server SharePoint di un'altra azienda. Stanno bene con questo.Come posso ignorare le X-Frame-Options: SAMEORIGIN HTTP Header?

La pagina che stiamo cercando di visualizzare nell'iframe ci fornisce X-Frame-Options: SAMEORIGIN che fa sì che il browser (almeno IE8) rifiuti di eseguire il rendering del contenuto in un frame.

In primo luogo, è qualcosa che possono controllare o è qualcosa che SharePoint fa solo di default? Se chiedo loro di disattivarlo, potrebbero farlo anche loro?

In secondo luogo, posso fare qualcosa per dire al browser di ignorare questa intestazione http e solo il rendering della cornice?

risposta

21

Se la seconda azienda è felice di poter accedere al proprio contenuto in un IFrame, allora è necessario rimuovere la restrizione - è possibile farlo abbastanza facilmente nella configurazione di IIS.

Non c'è nulla che tu possa fare per eluderlo e tutto ciò che funziona dovrebbe essere corretto rapidamente in un hotfix di sicurezza. Non è possibile dire al browser di eseguire il rendering del frame solo se l'intestazione del contenuto di origine non è consentita nei frame. Ciò renderebbe più facile il dirottamento di sessione.

Se il contenuto è solo RICEVI non si registrano i dati allora si potrebbe ottenere il lato server di pagine e proxy il contenuto senza l'intestazione, ma qualsiasi postback dovrebbe essere invalidato.

+0

la visualizzazione in un iframe non è consentita, ma esiste un modo per ottenere ancora l'html come stringa non elaborata? – Mike

+0

Dovresti essere in grado di grattarlo e fare quello che vuoi con il markup. – Legends

+1

@Legends è quello che intendevo per _proxy il content_ :-) – Keith

8

L'intestazione X-Frame-Options è una funzionalità di sicurezza applicata a livello di browser.

Se si ha il controllo sulla base di utenti (reparto IT per l'app di corp), è possibile provare qualcosa come uno script greasemonkey (se possibile a) distribuire greasemonkey tra tutti e b) distribuire lo script in modo condiviso). ..

In alternativa, è possibile delegare i risultati. Creare un endpoint sul proprio server e fare in modo che quell'endpoint apra una connessione all'endpoint di destinazione e semplicemente incanalare il traffico all'indietro.

4

Come per la seconda domanda: è possibile utilizzare i filtri Fiddler per impostare manualmente l'intestazione della risposta X-Frame-Options su qualcosa come ALLOW-FROM *. Ma, ovviamente, questo trucco funzionerà solo per te - gli altri utenti non saranno ancora in grado di vedere i contenuti iframe (se non fanno lo stesso).

12

È possibile bypass X-Frame-Options in un utilizzando YQL. Ecco una dimostrazione del concetto, testato in Chrome & Firefox: Hacker News in an <iframe>.

Il processo è il seguente:

  1. Richiedi URL iframe da YQL (funzione loadURL),
  2. ottenere un dati HTML da YQL (funzione getData),
  3. Aggiungi un <base link> e <script> caricamento dei collegamenti in un iframe utilizzando anche YQL,
  4. Inietti questo codice HTML in uno vuoto (funzione).

Il codice di esempio JS:

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 = 'http://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(/<head>/i, '<head><base href="' + url + '"><scr' + 'ipt>document.addEventListener("click", function(e) { if(e.target && e.target.nodeName == "A") { e.preventDefault(); parent.loadURL(e.target.href); } });</scr' + 'ipt>')); 
    iframe.contentWindow.document.close(); 
} 
loadURL(iframe.src); 
+5

Questo approccio sembra essere bloccato ora. –

+0

@KarlGlennon Funziona almeno in Firefox 44. – niutech

+0

"' Rifiutato di visualizzare 'https://news.ycombinator.com/' in un frame perché imposta 'X-Frame-Options' su 'DENY''. " Seguito da "' fiddle.jshell.net/:64 Unchaught SecurityError: violazione dell'accesso alla sandbox: bloccato un frame su "http://fiddle.jshell.net" dall'accesso a un frame su "null". Il frame a cui si accede è sandboxed e manca il flag "allow-same-origin". " – brichins

3

Sì Fiddler è un'opzione per me

Nella funzione OnBeforeResponse del (menu Fiddler> Regole> Regole Personalizza) CustomRules.js aggiungere il seguente linee

oSession.oResponse.headers.Remove("X-Frame-Options"); 
oSession.oResponse.headers.Add("Access-Control-Allow-Origin", "*"); 
+0

Questo ha funzionato come un fascino. Eccellente. – TrippinBilly

Problemi correlati