2010-05-06 13 views
30

Zajmuję się tworzeniem strony internetowej, która musi wyświetlać w iframe raport obsługiwany przez serwer SharePoint innej firmy. W porządku z tym.Jak można pominąć opcje X-Frame: nagłówek HTTP SAMEORIGIN?

Strona, którą próbujemy renderować w elemencie iframe, daje nam opcję X-Frame-Options: SAMEORIGIN, która powoduje, że przeglądarka (przynajmniej IE8) nie chce renderować zawartości w ramce.

Po pierwsze, czy jest to coś, co mogą kontrolować, czy jest to coś, co SharePoint po prostu robi domyślnie? Jeśli poproszę ich o wyłączenie tego, czy mogą to zrobić?

Po drugie, czy mogę coś zrobić, aby powiedzieć przeglądarce, aby zignorowała ten nagłówek http i po prostu renderowała ramkę?

Odpowiedz

21

Jeśli druga firma jest zadowolona z dostępu do ich zawartości w ramce IFrame, musi wyłączyć to ograniczenie - mogą to zrobić dość łatwo w konfiguracji IIS.

Nic nie można zrobić, aby go obejść, a wszystko, co działa, powinno zostać szybko załatane w poprawce zabezpieczeń. Nie można powiedzieć przeglądarce, aby wyrenderowała ramkę, jeśli nagłówek treści źródłowej nie jest dozwolony w ramkach. Ułatwiłoby to porwanie sesji.

Jeśli treść jest dostępna tylko wtedy, gdy nie publikujesz danych, możesz uzyskać stronę serwera i proxy zawartość bez nagłówka, ale wszelkie posty powinny zostać unieważnione.

+0

wyświetlanie w elemencie iframe jest niedozwolone, ale czy istnieje sposób na uzyskanie html jako nieprzetworzonego łańcucha? – Mike

+0

Powinieneś być w stanie go zeskrobać i zrobić, co chcesz, przy pomocy znaczników. – Legends

+1

@Legends to właśnie rozumiałem przez _proxy content_ :-) – Keith

8

Nagłówek X-Frame-Options jest zabezpieczeniem wymuszonym na poziomie przeglądarki.

Jeśli masz kontrolę nad swoją bazą użytkowników (dział IT dla aplikacji firmy corp), możesz wypróbować coś w rodzaju skryptu ze skryptem do smarowania (jeśli potrafisz) wdrożyć przycisk dla wszystkich i b) wdrożyć skrypt w sposób współdzielony). ..

Alternatywnie, możesz podać swój wynik. Utwórz punkt końcowy na swoim serwerze, aby ten punkt końcowy otwierał połączenie z docelowym punktem końcowym, i po prostu kieruj ruch do tyłu.

4

Jeśli chodzi o drugie pytanie - można użyć filtrów Fiddler, aby ustawić nagłówek odpowiedzi X-Frame-Options ręcznie na coś takiego jak ALLOW-FROM *. Ale, oczywiście, ta sztuczka zadziała tylko dla Ciebie - inni użytkownicy nadal nie będą mogli zobaczyć treści iframe (jeśli nie robią tego samego).

12

Możesz można ominąć X-Frame-Opcje w używając YQL. Oto dowód koncepcji, przetestowany w przeglądarce Chrome: & Firefox: Hacker News in an <iframe>.

Proces wygląda następująco:

  1. żądania URL iframe z YQL (funkcja loadURL)
  2. uzyskać dane HTML z YQL (funkcja getData)
  3. Dodaj <base link> i <script> ładowanie łączy w elemencie iframe również przy użyciu YQL,
  4. Wprowadzić ten kod HTML do pustego (funkcja loadHTML).

przykładowy kod 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

To podejście wygląda na zablokowane. –

+0

@KarlGlennon Działa przynajmniej w Firefox 44. – niutech

+0

"Odmówił wyświetlania" https://news.ycombinator.com/ "w ramce, ponieważ ustawił" X-Frame-Opcje "na" DENY''. " Następuje "' fiddle.jshell.net/:64 Uncaught SecurityError: naruszenie dostępu Sandbox: Zablokował ramkę w "http://fiddle.jshell.net" dostępu do ramki w "null". Dostęp do ramki jest piaskownicy i nie ma flagi "zezwalaj na to samo źródło". " – brichins

3

Tak Skrzypek jest opcją dla mnie

W funkcji OnBeforeResponse z CustomRules.js (menu Fiddler> Regulamin> Dostosuj Rules) Dodaje się następujący linie

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

To działało jak czar. Doskonały. – TrippinBilly

Powiązane problemy