Niektóre strony internetowe mają kod do „wyłamywania” IFRAME
załączników, co oznacza, że jeśli strona A
jest ładowana jako IFRAME
strona nadrzędna, P
część JavaScript A
przekierowuje do zewnętrznego okna A
.
Zwykle ten JavaScript wygląda mniej więcej tak:
<script type="text/javascript">
if (top.location.href != self.location.href)
top.location.href = self.location.href;
</script>
Moje pytanie brzmi: jako autor strony nadrzędnej P
i nie będący autorem strony wewnętrznej A
, jak mogę zapobiec A
temu wybuchowi?
PS Wydaje mi się, że powinno to być naruszenie bezpieczeństwa w różnych witrynach, ale tak nie jest.
javascript
html
iframe
Jason Cohen
źródło
źródło
Odpowiedzi:
Spróbuj użyć właściwości onbeforeunload, która pozwoli użytkownikowi zdecydować, czy chce opuścić stronę.
Przykład: https://developer.mozilla.org/en-US/docs/Web/API/Window.onbeforeunload
W HTML5 możesz użyć właściwości piaskownicy. Zobacz odpowiedź Pankrata poniżej. http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/
źródło
postMessage
. To nie jest zagrożenie dla bezpieczeństwa, ale ktoś może chcieć wiedzieć, że taka możliwość istnieje, gdy zobaczy Twój komentarz. :)sandbox
.W HTML5 dodano atrybut piaskownicy iframe . W chwili pisania tego tekstu działa to w Chrome, Safari, Firefox i najnowszych wersjach IE i Opery, ale robi prawie to, co chcesz:
<iframe src="url" sandbox="allow-forms allow-scripts"></iframe>
Jeśli chcesz zezwolić na przekierowania najwyższego poziomu, określ
sandbox="allow-top-navigation"
.źródło
sandbox
nie zezwala na Flash ani żaden inny typ obiektu w ramce w trybie piaskownicy, przez co tasandbox
funkcja jest w wielu przypadkach bezużyteczna.Używam piaskownicy = „...”
Górna nawigacja jest tym, co chcesz zapobiec, więc pomiń to, a nie będzie to dozwolone. Wszystko, co zostanie pominięte, zostanie zablokowane
dawny.
<iframe sandbox="allow-same-origin allow-scripts allow-popups allow-forms" src="http://www.example.com"</iframe>
źródło
Po przeczytaniu specyfikacji w3.org . Znalazłem właściwość piaskownicy.
Możesz ustawić
sandbox=""
, co zapobiega przekierowaniu elementu iframe. To powiedziawszy, nie przekieruje również elementu iframe. Zasadniczo stracisz kliknięcie.Przykład tutaj: http://jsfiddle.net/ppkzS/1/
Przykład bez piaskownicy: http://jsfiddle.net/ppkzS/
źródło
Wiem, że minęło dużo czasu, odkąd pytanie zostało zrobione, ale tutaj moja ulepszona wersja będzie czekała 500 ms na każde kolejne połączenie tylko wtedy, gdy ramka iframe jest załadowana.
<script type="text/javasript"> var prevent_bust = false ; var from_loading_204 = false; var frame_loading = false; var prevent_bust_timer = 0; var primer = true; window.onbeforeunload = function(event) { prevent_bust = !from_loading_204 && frame_loading; if(from_loading_204)from_loading_204 = false; if(prevent_bust){ prevent_bust_timer=500; } } function frameLoad(){ if(!primer){ from_loading_204 = true; window.top.location = '/?204'; prevent_bust = false; frame_loading = true; prevent_bust_timer=1000; }else{ primer = false; } } setInterval(function() { if (prevent_bust_timer>0) { if(prevent_bust){ from_loading_204 = true; window.top.location = '/?204'; prevent_bust = false; }else if(prevent_bust_timer == 1){ frame_loading = false; prevent_bust = false; from_loading_204 = false; prevent_bust_timer == 0; } } prevent_bust_timer--; if(prevent_bust_timer==-100) { prevent_bust_timer = 0; } }, 1); </script>
i
onload="frameLoad()"
ionreadystatechange="frameLoad();"
mogą być dodawane do ramy lub iframe.źródło
Znalazłem kilka przydatnych hacków na ten temat:
Używając JS, w jaki sposób mogę powstrzymać podrzędne elementy iframe przed przekierowaniem lub przynajmniej poprosić użytkowników o przekierowanie
http://www.codinghorror.com/blog/2009/06/we-done-been-framed.html
http://coderrr.wordpress.com/2009/02/13/preventing-frame-busting-and-click-jacking-ui-redressing/
źródło
Ponieważ strona, którą ładujesz wewnątrz elementu iframe, może wykonać kod „wyłamać” za pomocą parametru setInterval, onbeforeunload może nie być tak praktyczne, ponieważ może spowodować wyświetlenie użytkownikowi komunikatu „Czy na pewno chcesz wyjść?” okna dialogowe.
Istnieje również atrybut bezpieczeństwa iframe, który działa tylko w IE i Opera
:(
źródło
W moim przypadku chcę, aby użytkownik odwiedził wewnętrzną stronę, aby serwer widział jego adres IP jako odwiedzający. Jeśli użyję techniki proxy php, myślę, że strona wewnętrzna zobaczy mój adres IP serwera jako odwiedzającego, więc nie jest to dobre. Jedynym rozwiązaniem, jakie do tej pory otrzymałem, jest chęć włączenia się przed załadowaniem. Umieść to na swojej stronie:
<script type="text/javascript"> window.onbeforeunload = function () { return "This will end your session"; } </script>
Działa to zarówno w Firefoksie, jak i to jest to, co testowałem. znajdziesz wersje używające czegoś takiego jak evt.return (cokolwiek) bzdury ... to nie działa w Firefoksie.
źródło
W ten sposób będziesz mógł kontrolować dowolne działanie strony w ramce, czego nie możesz. Obowiązują zasady dotyczące tej samej domeny .
źródło