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.
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.
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
i self
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ą:
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ć.
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 .
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.
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.
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>
<?php
header("Content-Security-Policy: frame-ancestors 'none'");
?>