Szkodliwe okna dialogowe „potwierdzaj nawigację”?

32

Niektóre witryny, takie jak StackExchange, wyświetlają komunikat „Czy na pewno chcesz opuścić tę stronę?” okno dialogowe, gdy próbujesz odejść pod pewnymi warunkami, na przykład jeśli masz post, którego edytowanie nie zostało jeszcze ukończone. To jest pomocne!

Niestety, złośliwe lub zainfekowane witryny lubią używać tej samej funkcji, mówiąc: „Hej! Nie zainstalowałeś naszego złośliwego oprogramowania antywirusowego w celu usunięcia 111 wirusów, których zdecydowanie nie kłamiemy na temat znalezienia na twoim komputerze!” Oraz „Zostaw to strona ”i„ Pozostań na tej stronie ”opcje zostały zastąpione przez„ Bądź bezpieczny. Zainstaluj nasz produkt ”i„ Zastrzel się w nogę ”. To nie jest pomocne!

JavaScript potrafi robić paskudne rzeczy. Kiedy otrzymam jedno z tych okien dialogowych, które próbują powstrzymać mnie przed opuszczeniem wyraźnie złośliwej witryny, jaka powinna być moja odpowiedź? Czy bezpiecznie jest kliknąć „Opuść tę stronę” lub cokolwiek, na co zastąpili tekst? Czy witryna może zmienić zachowanie przycisku lub przechwycić moją próbę nawigowania i narysować własne fałszywe okno dialogowe, które robi wszystko, co chce atakujący, gdy kliknę na niego?

user2357112 obsługuje Monikę
źródło
1
Po prostu zabiłbym cały proces przeglądarki od eksploratora procesów lub jego ekwiwalentu. O wiele bezpieczniejsze, ponieważ nie wiesz, że przycisk faktycznie mówi.
Journeyman Geek

Odpowiedzi:

24

Pomimo tego, co mówią niektóre z tych okien dialogowych, nie mogą zrobić nic złośliwego . Zawsze możesz kliknąć OK lub Opuść stronę, aby zamknąć niepoprawną stronę bez żadnych konsekwencji.

Jeśli okno dialogowe jest zbyt długie, a przyciski są poza ekranem , możesz nacisnąć,Enter aby potwierdzić zamknięcie strony.

Jeśli nie masz klawiatury (urządzenia z ekranem dotykowym), skorzystaj z bookmarkletu poniżej lub zobacz odpowiedź SimpleSimon (tylko Chrome).


Teraz kilka szczegółów.

Jest tylko jeden sposób na wykonanie akcji, gdy strona się zamyka: poprzez onbeforeunloadzdarzenie. Oczywiście można tego łatwo użyć przeciwko użytkownikowi (na przykład, gdy próbuje zamknąć stronę, otwiera jej kopię w nowym oknie), więc jest bardzo ograniczony.

Właściwie jedyną rozsądną rzeczą, jaką możesz zrobić, to otworzyć okno dialogowe z niestandardowym tekstem i dwoma przyciskami, jednym do opuszczenia strony, a drugim do pozostania. Jedyną rzeczą, którą strona może zrobić z tym oknem dialogowym, jest zdefiniowanie tekstu. Przyciski i pasek tytułowy są niezmienne. Oto zrzut ekranu z przeglądarki Firefox 3.6: ( bardzo stara wersja przeglądarki Firefox)

Zrzut ekranu z Firefoksa 3.6

Oczywiście, kiedy pozwalasz ludziom wyświetlać wyskakujące okienka z dowolnym tekstem i tylko przyciskami OK / Anuluj , możesz być pewien, że wcześniej czy później niektórzy faceci użyją go przeciwko tobie.

Zrzut ekranu złośliwego systemu Windows z przeglądarki Firefox 3.6

Na powyższym zrzucie ekranu OK oznacza po prostu „Opuść tę stronę”, ale niestandardowy opis sugeruje coś więcej. Dlatego przeglądarki zmieniły okna dialogowe, dlatego trudniej jest wprowadzić je w błąd. Na przykład ostatnie wersje Firefoksa wydają się ignorować niestandardowy tekst:

Zrzut ekranu z przeglądarki Firefox 23

Chrome wyświetla niestandardowy tekst, ale zawsze dołącza pytanie z pytaniem, co chce zrobić, a przyciski wyraźnie określają jego działania: (ale nadal jest podatny na komunikaty „kocich filmów”!)

Zrzut ekranu z Chrome 29

Oto Internet Explorer 10, również „podatny na kota”:

Zrzut ekranu z IE 10

Opera 12 po prostu ignoruje onbeforeunloadzdarzenie, a jeśli spróbujesz zamknąć taką kartę, zamknie się ona tak jak każda inna. Jednak nie testowałem najnowszej Opery.

Podsumowując najważniejsze rzeczy:

  • Strony nie mogą wyświetlać okien dialogowych z żadnym tekstem. Witryna może poprosić przeglądarkę o wyświetlenie okna dialogowego z niestandardowym tekstem, ale przeglądarka może go całkowicie zignorować (Opera), użyć tekstu ogólnego (Firefox) lub wyraźnie powiedzieć, co się stanie (Chrome, IE).
  • Szczegóły okna dialogowego zależą od używanej przeglądarki, ale przyciski są zawsze niezmienne. Jeśli nie powie jednoznacznie, który z nich co robi, wówczas OK oznacza „opuść tę stronę *, a Cancel oznacza„ zostań tutaj ”.
  • Strony internetowe nie mogą wykonywać żadnych złośliwych działań, jeśli zdecydujesz się je opuścić. Twoje pliki nie zostaną zastąpione filmami z kotami, nie zostaniesz zalany 135234 wirusami, a FBI nie zostanie poinformowane, że masz nielegalne oprogramowanie na swoim komputerze.

Możesz wyłączyć onbeforeunloadzdarzenie, jeśli chcesz, skutecznie uniemożliwiając stronom proszenie o opuszczenie lub pozostanie. Oto skrypt użytkownika dla różnych przeglądarek . (przewiń w dół, jeśli link nie działa)

Jeśli korzystasz z konkretnej witryny, która wyświetla złośliwe okienko wyskakujące i nadal boisz się kliknąć przycisk Opuść , możesz utworzyć skryptozakładkę, aby ją usunąć. Kliknij pasek zakładek prawym przyciskiem myszy, wybierz opcję Nowa zakładka (lub jej odpowiednik) i wklej to jako adres URL: (to tylko zminimalizowany kod z powyższego linku)

javascript:var x=document.createElement('script');x.type='text/javascript';x.innerHTML='onbeforeunload=function(){};';document.body.appendChild(x);

Następnie po prostu kliknij tę zakładkę, a wyskakujące okienko zostanie tymczasowo usunięte z aktywnej strony.

Jeśli chcesz przetestować wyskakujące okienka w przeglądarce lub przetestować bookmarklet / skrypt użytkownika, utwórz plik tekstowy z następującym kodem i zapisz go jako .htmlplik:

<html><body onbeforeunload="return 'My custom text.'">_</body></html>

Wygląda na to, że link skryptu użytkownika jest teraz martwy, więc oto kopia wyodrębniona z pamięci podręcznej archive.org . Podziękowania dla oryginalnego twórcy skryptu.

// ==UserScript==
// @name           Disable - remove onbeforeunload
// @namespace      
// @description    Disable - remove the annoying onbeforeunload event
// @include        *
// @author         netvisiteurs.com
// ==/UserScript==

var x = document.createElement('script');
x.type = 'text/javascript';
x.innerHTML = 'onbeforeunload = function() {};';
document.body.appendChild(x);
gronostaj
źródło
2
Nacisnąłbym „OK” na tym drugim. W końcu kto nie chce więcej filmów z kotami?
Daniel R Hicks,
Ooh, Javascript, aby wyłączyć okno dialogowe. Miły!
user2357112 obsługuje Monikę
Niestety, ten skrypt użytkownika nie działa poprawnie na niektórych stronach internetowych. Okno dialogowe jest nadal wyświetlane, mimo że window.onbeforeunload i window.onunload są puste. Nie wiem, jak im się to udaje, przypuszczam, że program obsługi jest w pewnym momencie nadpisywany, a potem może przywracany do wartości zerowej w przypadku jakiegoś zdarzenia onclick.
Atan
10

W rzeczywistości FireFox ma dość sprytne (i łatwe) rozwiązanie. Jeśli wpiszesz

about:config

do paska adresu, a następnie przewiń w dół do

dom.disable_beforeunload

i po ustawieniu jego wartości na True, nie będzie już wyświetlane wyskakujące okienko opuszczania strony. W FireFox. Szkoda, że ​​nie ma podobnego obejścia w Chrome.

Wielebny Jim
źródło
7

Najprostszym rozwiązaniem w Chrome jest zawieszenie karty.

Wpisz chrome: // crash w pasek adresu i zapisz jako zakładkę .

Następnym razem, gdy chcesz opuścić taką stronę, po prostu kliknij zakładkę, a ona natychmiast zabije tę kartę, bez wpływu na inne karty. Nie trzeba zabijać całej sesji przeglądarki, jak sugerują niektórzy inni.

Możesz też zawiesić kartę za pomocą chrome: // zawiesić, a następnie po prostu zamknąć kartę bez uruchamiania JavaScript.

Nie jestem pewien, czy jest to możliwe w innych przeglądarkach.

SimpleSimon
źródło
Nowsze wersje tych stron będą wyświetlać kolejne wyskakujące okienko przy dowolnej akcji użytkownika, takiej jak kliknięcie myszą lub naciśnięcie klawisza, więc nie możesz już chrome: // crash
rsaxvc
1

Jest to zdarzenie window.onbeforeunload i funkcja przeglądarki internetowej. Powinno to być stałe okno dialogowe przeglądarki internetowej. Możesz wypróbować w różnych przeglądarkach, więc możesz zobaczyć, że okna dialogowe mają różne wzory.

Ale zakładam, że możesz stworzyć wyskakujące okienko z javascript, które wygląda bardzo bardzo podobnie do oryginalnego wyskakującego okienka przeglądarki. A jeśli jest to dobry programista, sprawdziłby także typ przeglądarki przed wyświetleniem okna dialogowego. ;)

Aby więc mieć pewność co do oryginalnego okna dialogowego, należy równolegle sprawdzić poprawne okno dialogowe, tj. Tutaj: http://samples.msdn.microsoft.com/workshop/samples/author/dhtml/refs/onbeforeunload.htm

Zobacz tutaj, aby uzyskać dodatkowe informacje na temat wydarzenia:
https://developer.mozilla.org/en-US/docs/Web/API/window.onbeforeunload
http://msdn.microsoft.com/en-us/library/ms536907% 28VS.85% 29.aspx

Chris
źródło
0

Szybkie obejście problemu, jeśli nie ufasz oknu wyskakującemu i jego zamiarom / działaniom:

W przypadku Chrome:

  • Escape, aby usunąć wyskakujące okienko

  • Kliknij stronę prawym przyciskiem myszy

  • Wybierz Sprawdź

  • Przewiń do góry

  • Kliknij znacznik prawym przyciskiem myszy

  • Usuń węzeł

  • Zamknij kartę

Jestem pewien, że inne przeglądarki mają podobne opcje.

George 2.0 Hope
źródło
3
Szybsze obejście: zawsze kliknij Opuść tę stronę ;)
gronostaj