Frame Busting Buster не полностью работает для IE - PullRequest
6 голосов
/ 29 сентября 2011

Я работал над уничтожением фреймов (что зовется именем, хе-хе), который держал моих пользователей на моей странице и открывал новое окно с целевым URL.Я использую скрипт Lightbox для отображения фреймов, вот что я делаю:

1) Добавлено событие для всех кликов .lightbox, например:

$('.lightbox').live("click", function(e) { 
  e.preventDefault(); 
  $('#redirectURL').val($(this).attr('href')); 
  $(this).lightbox(); 
}

2) Добавленобастер очистки кадра:

<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://server-which-responds-with-204.com'  
      }  
    }, 1)  
</script>

3) Изменен код бастера очистки кадра, чтобы соответствовать моим потребностям, а именно:

  • определить, хочет ли iframe изменить window.top.location
  • если это так, предотвратите это, используя ответ сервера 204
  • откройте новую страницу: window.open( $('#redirectURL', '_blank' );
  • закройте лайтбокс: $('.jquery-lightbox-button-close').click();

Пока что вот что я придумал:

var prevent_bust = 0  
window.onbeforeunload = function() { prevent_bust++ }  
setInterval(function() {  
  if (prevent_bust > 0) {  
    prevent_bust -= 2;
    redirectURL = $('#redirectURL').val();
    if(redirectURL != "") {
        window.top.location = 'http://www.****.com/ajax/nocontent.php';
        window.open(redirectURL, "_blank");
        $('.jquery-lightbox-button-close').click();
        $('#redirectURL').val('');
    } else {
        window.top.location = 'http://www.****.com/ajax/nocontent.php';
    }
  }  
}, 1); 

// РЕДАКТИРОВАТЬ: Before I forget, 'nocontent.php' is a file that returns a 204 header

Для Firefox он действует так, как я его запрограммировал, еслив window.top.location обнаружено изменение: он открывает новый фрейм / страницу и предотвращает перезагрузку верхнего элемента iframe, а затем округляет его, закрывает лайтбокс jQuery.

Safari / Chrome действует аналогично, они открывают новый экран браузера (not sure if theres an option to say target="_newtab" or something?).Плохо только то, что они на самом деле не отображают сообщение о блокировке всплывающего окна, но я могу обойти это, отобразив всплывающее окно на моем веб-сайте со ссылкой на страницу.

Internet Explorer - это то, чтошокер, единственная паршивая овца осталась .. IE не открывает новое всплывающее окно и не блокирует сброс window.top.location с помощью iFrame и просто продолжает обновлять всю страницу до «#targetURL».Он делает то же самое с кодом очистки по умолчанию ... так что это не из-за некоторых моих правок.

Кто-нибудь, кто может обнаружить ошибку в моем коде?

Кроме того, мне нужнонебольшая модификация, которая проверяет, был ли запрос сделан iframe или самим пользователем, потому что теперь нет никакой возможности для пользователя покинуть мою страницу, изменив адрес на панели инструментов или нажав ссылку, которая не являетсяочень нужно LOL.

Заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 08 октября 2011

PENDO, я пытался смоделировать весь процесс, который вы описали, ligthbox-jquery, javascript свои собственные коды и контролирует открытие страниц через лайтбокс.Я никак не мог имитировать, и со временем я посылаю предложение расширить спектр возможностей и решений.Я предлагаю заменить страницу перенаправления:

 ...
  redirectUrl = $ ('# redirectUrl'). val ();
 ...
 window.top.location = 'http://www .****. with / ajax / nocontent.php';
 window.open (redirectUrl, "_blank");

Заменен контейнером DIV, имитирующим страницу, использующим вызовы ajax, принимающим содержимое и перезаписывающим содержимое DIV.

 ...
 $.post(redirectoURL /* or desired URL */, function(data) {
     $('DIV.simulateContent').html(data);
 });
 ...

или

 ...
 $('DIV.simulateContent').load(redirectoURL);
 ...

Этот подход также позволяет избежать проблемы, когда пользователь даже не покидает вашу страницу, используя адресную строку (как вы сами упомянули).

Извините, позвольте мне дать вам полноерешение, но время помешало мне.

PENDO, немного больше работы над альтернативами проблемы, я нашел настраиваемый плагин лайтбокса jQuery для работы с пользовательскими окнами (iframe, html, inline ajax и т. д.).Может быть, это поможет.Следующая ссылка:

 http://jacklmoore.com/colorbox/
0 голосов
/ 08 октября 2011

Если вам не нужен JavaScript, работающий в вашем iframe в IE, вы можете установить атрибут безопасности iframe:

<iframe security="restricted" src="http://domain.com" />

http://msdn.microsoft.com/en-us/library/ms534622(v=VS.85).aspx

...