Załóżmy, że nie chcesz, aby inne witryny „kadrowały” Twoją witrynę w <iframe>
:
<iframe src="http://example.org"></iframe>
W ten sposób wstawiasz JavaScript przeciw kadrowaniu i pomijaniu ramek na wszystkich swoich stronach:
/* break us out of any containing iframes */
if (top != self) { top.location.replace(self.location.href); }
Świetny! Teraz automatycznie „kasujesz” lub wyłamujesz się z dowolnego zawierającego iframe. Z wyjątkiem jednego małego problemu.
Jak się okazuje, Twój kod pomijania ramek może zostać pomijany , jak pokazano tutaj :
<script type="text/javascript">
var prevent_bust = 0
window.onbeforeunload = function() { prevent_bust++ }
setInterval(function() {
if (prevent_bust > 0) {
prevent_bust -= 2
window.top.location = 'http://example.org/page-which-responds-with-204'
}
}, 1)
</script>
Ten kod wykonuje następujące czynności:
- zwiększa licznik za każdym razem, gdy przeglądarka próbuje opuścić bieżącą stronę za pośrednictwem modułu
window.onbeforeunload
obsługi zdarzeń - ustawia licznik czasu, który jest uruchamiany co milisekundę
setInterval()
, a jeśli widzi zwiększenie licznika, zmienia bieżącą lokalizację na serwer kontroli atakującego - ten serwer wyświetla stronę z kodem stanu HTTP 204 , co nie powoduje nawigacji w przeglądarce
Moje pytanie brzmi - a to bardziej łamigłówka JavaScript niż faktyczny problem - w jaki sposób możesz pokonać pogromcę klatek?
Miałem kilka myśli, ale nic nie działało w moich testach:
- próba wyczyszczenia
onbeforeunload
zdarzenia przezonbeforeunload = null
nie przyniosła żadnego efektu - dodanie
alert()
zatrzymanego procesu informuje użytkownika, że to się dzieje, ale nie ingeruje w kod w żaden sposób; kliknięcie OK pozwala normalnie kontynuować pomijanie - Nie mogę wymyślić żadnego sposobu na wyczyszczenie
setInterval()
timera
Nie jestem zbytnio programistą JavaScript, więc oto moje wyzwanie: hej, czy możesz zepsuć niszczyciel klatek?
example.org
jak określono w RFC 2606 ietf.org/rfc/rfc2606.txt