Frame Buster Buster… нужен код ошибки

Вы можете попытаться использовать процент в координатах, но он не будет работать в большинстве браузеров (если не все). Поэтому вы должны использовать JavaScript. Или используйте абсолютные позиционные divs с процентными координатами вместо карты.

408
задан David Archer 27 August 2012 в 16:51
поделиться

13 ответов

Я не уверен, жизнеспособно это или нет - но если вы не можете сломать фрейм, почему бы просто не отобразить предупреждение. Например, если ваша страница не является «верхней страницей», создайте метод setInterval, который пытается разорвать фрейм. Если после 3 или 4 попыток ваша страница все еще не является верхней страницей - создайте элемент div, который покрывает всю страницу (модальное окно) сообщением и ссылкой, например ...

Вы просматриваете эту страницу в неавторизованном окно фрейма - (Бла-бла ... потенциальная проблема безопасности)

щелкните по этой ссылке, чтобы исправить эту проблему

Не лучший вариант, но я не вижу никакого способа, которым они могли бы решить эту проблему.

148
ответ дан 22 November 2019 в 23:26
поделиться

А как насчет того, чтобы звонить нарушителю несколько раз? Это создаст состояние гонки, но можно надеяться, что прерыватель выйдет лучше:

(function() {
    if(top !== self) {
        top.location.href = self.location.href;
        setTimeout(arguments.callee, 0);
    }
})();
2
ответ дан 22 November 2019 в 23:26
поделиться

Думаю, вы были почти у цели. Вы пробовали:

window.parent.onbeforeunload = null;
window.parent.location.replace(self.location.href);

или, альтернативно:

window.parent.prevent_bust = 0;

Примечание: я на самом деле не проверял это.

3
ответ дан 22 November 2019 в 23:26
поделиться

Что ж, вы можете изменить значение счетчика, но это, очевидно, хрупкое решение. Вы можете загрузить свой контент через AJAX после того, как определили, что сайт находится вне фрейма - тоже не лучшее решение, но, надеюсь, оно позволяет избежать срабатывания события on beforeunload (я предполагаю).

Edit: Другая идея. Если вы обнаружите, что находитесь во фрейме, попросите пользователя отключить javascript, прежде чем щелкнуть ссылку, которая приведет вас к желаемому URL-адресу (передача строки запроса, которая сообщает вашей странице, чтобы сообщить пользователю, что они могут повторно включить javascript, когда они

Редактировать 2: Идите ядерно - если вы обнаружите, что находитесь во фрейме, просто удалите содержимое тела документа и напечатайте какое-нибудь неприятное сообщение.

Редактировать 3: Можете ли вы перечислить верхний документ и установить все функции обнулить (даже анонимные)?

4
ответ дан 22 November 2019 в 23:26
поделиться

Придумал это, и, похоже, он работает, по крайней мере, в Firefox и браузере Opera.

if(top != self) {
 top.onbeforeunload = function() {};
 top.location.replace(self.location.href);
}
29
ответ дан 22 November 2019 в 23:26
поделиться

Итак, мы знаем, что были в кадре. Итак, мы location.href на другую специальную страницу с путем в качестве переменной GET. Теперь мы объясняем пользователю, что происходит, и предоставляем ссылку с параметром target = "_ TOP". Это просто и, вероятно, сработает (не тестировал), но требует некоторого взаимодействия с пользователем. Может быть, вы могли бы указать пользователю сайт-нарушитель и устроить где-нибудь позор клик-джекеров на своем сайте .. Просто идея, но это ночная работа ..

5
ответ дан 22 November 2019 в 23:26
поделиться

Поразмыслив немного, я считаю, что это покажет им, кто здесь главный ...

if(top != self) {
  window.open(location.href, '_top');
}

Использование _top в качестве целевого параметра для окна . open () запустит его в том же окне.

19
ответ дан 22 November 2019 в 23:26
поделиться
if (top != self) {
  top.location.replace(location);
  location.replace("about:blank"); // want me framed? no way!
}
6
ответ дан 22 November 2019 в 23:26
поделиться

All the proposed solutions directly force a change in the location of the top window. What if a user wants the frame to be there? For example the top frame in the image results of search engines.

I wrote a prototype where by default all inputs (links, forms and input elements) are disabled and/or do nothing when activated.

If a containing frame is detected, the inputs are left disabled and a warning message is shown at the top of the page. The warning message contains a link that will open a safe version of the page in a new window. This prevents the page from being used for clickjacking, while still allowing the user to view the contents in other situations.

If no containing frame is detected, the inputs are enabled.

Here is the code. You need to set the standard HTML attributes to safe values and add additonal attributes that contain the actual values. It probably is incomplete and for full safety additional attributes (I am thinking about event handlers) will probably have to be treated in the same way:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
  <head>
    <title></title>
    <script><!--
      function replaceAttributeValuesWithActualOnes( array, attributeName, actualValueAttributeName, additionalProcessor ) {
        for ( var elementIndex = 0; elementIndex < array.length; elementIndex += 1 ) {
          var element = array[ elementIndex ];
          var actualValue = element.getAttribute( actualValueAttributeName );
          if ( actualValue != null ) {
            element[ attributeName ] = actualValue;
          }

          if ( additionalProcessor != null ) {
            additionalProcessor( element );
          }
        }
      }

      function detectFraming() {
        if ( top != self ) {
          document.getElementById( "framingWarning" ).style.display = "block";
        } else {
          replaceAttributeValuesWithActualOnes( document.links, "href", "acme:href" );

          replaceAttributeValuesWithActualOnes( document.forms, "action", "acme:action", function ( form ) {
            replaceAttributeValuesWithActualOnes( form.elements, "disabled", "acme:disabled" );
          });
        }
      }
      // -->
    </script>
  </head>
  <body onload="detectFraming()">
    <div id="framingWarning" style="display: none; border-style: solid; border-width: 4px; border-color: #F00; padding: 6px; background-color: #FFF; color: #F00;">
      <div>
        <b>SECURITY WARNING</b>: Acme App is displayed inside another page.
        To make sure your data is safe this page has been disabled.<br>
        <a href="framing-detection.html" target="_blank" style="color: #090">Continue working safely in a new tab/window</a>
      </div>
    </div>
    <p>
      Content. <a href="#" acme:href="javascript:window.alert( 'Action performed' );">Do something</a>
    </p>
    <form name="acmeForm" action="#" acme:action="real-action.html">
      <p>Name: <input type="text" name="name" value="" disabled="disabled" acme:disabled=""></p>
      <p><input type="submit" name="save" value="Save" disabled="disabled" acme:disabled=""></p>
    </form>
  </body>
</html>
5
ответ дан 22 November 2019 в 23:26
поделиться

Если вы добавите предупреждение сразу после кода блокировки, оно остановит поток javascript и позволит загрузиться странице. Это то, что делает StackOverflow, и он вылетает из моих окон iframe, даже когда я использую прерыватель удаления кадров. Он также работал с моей простой тестовой страницей. Это было протестировано только в Firefox 3.5 и IE7 на Windows.

Код:

<script type="text/javascript">
if (top != self){
  top.location.replace(self.location.href);
  alert("for security reasons bla bla bla");
}
</script>
4
ответ дан 22 November 2019 в 23:26
поделиться

setInterval и setTimeout создают автоматический интервал инкремента. Каждый раз при вызове setTimeout или setInterval этот номер увеличивается на единицу, так что при вызове setTimeout вы получите текущее, наибольшее значение.

   var currentInterval = 10000;
   currentInterval += setTimeout( gotoHREF, 100 );
   for( var i = 0; i < currentInterval; i++ ) top.clearInterval( i );
   // Include setTimeout to avoid recursive functions.
   for( i = 0; i < currentInterval; i++ )     top.clearTimeout( i );

   function gotoHREF(){
           top.location.href = "http://your.url.here";
   }

Так как почти неслыханно, чтобы одновременно работали 10000 setIntervals и setTimeouts, а так как setTimeout возвращает "последний созданный интервал или таймаут + 1", и так как top.clearInterval все еще доступен, это одолеет атаки черных шляп на сайты, которые описаны выше.

.
0
ответ дан 22 November 2019 в 23:26
поделиться

Если вы посмотрите на значения, возвращаемые setInterval(), то они обычно состоят из одних цифр, поэтому вы можете отключить все такие прерывания одной строкой кода:

for (var j = 0 ; j < 256 ; ++j) clearInterval(j)
2
ответ дан 22 November 2019 в 23:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: