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.
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ą:
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/…
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 .
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
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ć:
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.
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.
Odpowiedzi:
Nie możesz tego sprawdzić od strony serwera, ale możesz użyć javascript, aby wykryć to po załadowaniu strony. Porównaj
top
iself
jeśli nie są identyczne, jesteś w kadrze.Ponadto niektóre nowoczesne przeglądarki obsługują
X-FRAME-OPTIONS
nagłówek, który może mieć dwie wartości:Użytkownicy obejmują Picasę Google, której nie można osadzić w ramce.
Przeglądarki obsługujące nagłówek, z minimalną wersją:
źródło
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ć.
źródło
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 .
źródło
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.
źródło
sandbox
Atrybut 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.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.com
osadzasz 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.com
on 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.źródło
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>
źródło
<?php header("Content-Security-Policy: frame-ancestors 'none'"); ?>
źródło