Jak uniemożliwić ładowanie mojej strony witryny przez zewnętrzną ramkę witryny iFrame

81

Jak mogę się dowiedzieć, że moja strona jest osadzona jako ramka w innej witrynie podczas ładowania strony? Wydaje mi się, że nagłówek żądania strony odsyłającej nie może mi tutaj pomóc? Dzięki.

powyżej
źródło
Cześć John, nie mogę powiedzieć, że potrzebuję tutaj kompletnego rozwiązania, wystarczy zmienić kierunek, po znalezieniu odpowiedzi na moje pytanie zawsze publikuję je jako odpowiedź, tylko w ten sposób mogę uczestniczyć w społeczności.
ponad
Uwaga: ustawienie metatagu jest bezużyteczne! Na przykład <meta http-equiv = "X-Frame-Options" content = "deny"> nie ma żadnego efektu. Nie używaj tego! Opcje X-Frame będą działać tylko po ustawieniu przez nagłówek HTTP, jak w przykładach poniżej. developer.mozilla.org/fr/docs/Web/HTTP/Headers/X-Frame-Options
Hosam Elzagh

Odpowiedzi:

102

Nie możesz tego sprawdzić od strony serwera, ale możesz użyć javascript, aby wykryć to po załadowaniu strony. Porównaj topi selfjeśli nie są identyczne, jesteś w kadrze.

Ponadto niektóre nowoczesne przeglądarki obsługują X-FRAME-OPTIONSnagłówek, który może mieć dwie wartości:

  • ODMÓW - zapobiega renderowaniu strony, jeśli znajduje się w ramce
  • SAMEORIGIN - to samo co powyżej, chyba że strona należy do tej samej domeny co właściciel zestawu ramek najwyższego poziomu.

Użytkownicy obejmują Picasę Google, której nie można osadzić w ramce.

Przeglądarki obsługujące nagłówek, z minimalną wersją:

  • IE8 i IE9
  • Opera 10.50
  • Safari 4
  • Chrome 4.1.249.1042
  • Firefox 3.6.9 (starsze wersje z NoScript )
Maerlyn
źródło
2
Ponieważ natknąłem się tutaj przez wyszukiwarkę Google, dodam, że Firefox dodał X-FRAME-OPTIONS w sierpniu 2010 z FF3.6.9: michael-coates.blogspot.com/2010/08/…
ThePants
44

Stackoverflow zawiera trochę JS do testowania ( master.js). Oto odpowiednia część tego:

if(top!=self){
    top.location.replace(document.location);
    alert("For security reasons, framing is not allowed; click OK to remove the frames.")
}

Pamiętaj jednak, że JS można wyłączyć.

Felix Kling
źródło
Takie podejście jest szczególnie przydatne, jeśli chcesz otrzymać wiadomość albo do osoby, która umieszcza treść w ramce iframe, albo do użytkownika końcowego witryny, który przegląda zawartość w ramce iframe.
kevinmicke
30

W przypadku nowoczesnych przeglądarek można skorzystać ze standardu CSP (Content Security Policy). Poniższy nagłówek uniemożliwi załadowanie dokumentu do ramki w dowolnym miejscu:

Content-Security-Policy: frame-ancestors 'none'

( X-Chociaż IE 11 potrzebuje prefiksu). Możesz także zmienić 'none'źródło, w którym ramkowanie jest dozwolone, na przykład własną witrynę.

Aby objąć starsze przeglądarki, najlepiej użyć tego razem z odpowiedzią @ Maerlyn .

rvighne
źródło
1
Twoja odpowiedź nie jest wystarczająco jasna, z całym szacunkiem. Czy to kod nagłówka czy PHP? Na przykład.
Gary Carlyle Cook
2
@GaryCarlyleCook To jest nagłówek HTTP, który powinien być częścią odpowiedzi do przeglądarki podczas udostępniania strony. To nie jest kod PHP, chociaż możesz użyć PHP do jego wysłania; patrz nagłówek ()
rvighne
15

możesz zapobiec ładowaniu strony w ramce iframe za pomocą javascript

<script type="text/javascript">
if ( window.self !== window.top ) {
    window.top.location.href=window.location.href;
}
</script>

ten kod zmienia adres kontenera elementu iframe Twojej strony na adres Twojej strony i wymusza na kontenerze wyświetlanie Twojej strony.

iman
źródło
1
sandboxAtrybut w iframe pozwala zabronić takich hacków uciekających przed ramkami. Tak więc ten sposób nie jest bezpiecznym sposobem zapobiegania kadrowaniu, jeśli martwisz się kwestiami bezpieczeństwa.
Frédéric
6

Możesz też zablokować określoną domenę, jeśli nie masz nic przeciwko treściom w niektórych lokalizacjach, ale nie chcesz ich w określonej witrynie. Na przykład, jeśli offendingdomain.comosadzasz zawartość, możesz to zrobić:

<script type="text/javascript">
    if(document.referrer.indexOf("offendingdomain.com") != -1) {
        window.location = "http://www.youtube.com/watch_popup?v=oHg5SJYRHA0";
    }
</script>

Spowoduje to sprawdzenie lokalizacji dokumentu nadrzędnego i sprawdzenie, czy to offendingdomain.comon osadza Twoją treść. Ten skrypt wyśle ​​następnie tę ramkę iframe do pewnego słynnego filmu na YouTube jako karę. W efekcie po prostu się Rick-Rolledli.

Earl3s
źródło
3

Użyj javascript, aby sprawdzić, czy został załadowany w ramce iframe, umieszczając następujący skrypt na końcu pliku php i przekierowując na stronę, która wyświetla ostrzeżenie lub informację, że Twoja strona nie powinna być ładowana przy użyciu iframe.

<script type="text/javascript">
if(top.location != window.location) {
    window.location = '/error_iframe.php';
}
</script>
jmslouie
źródło
-1
<?php
    header("Content-Security-Policy: frame-ancestors 'none'");
?> 
Ugur Ergun
źródło