Используя JS, как я могу мешать ребенку Iframes перенаправить или по крайней мере предложить пользователям о перенаправлении

var $msg = $('#msg-container-id');
$msg.fadeIn(function(){
  setTimeout(function(){
    $msg.fadeOut(function(){
      $msg.remove();
    });
  },5000);
});
14
задан Community 23 May 2017 в 12:24
поделиться

2 ответа

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

if( top != self )
    delete top.onbeforeunload;

После того, как это было вызвано, prevent_bust никогда не будет увеличиваться, и это означает, что веб-сайт будет свободно перенаправлен без вашего согласия или ведома. Плохая сделка.

Если вам нужна стабильно функциональная версия этого решения, я бы порекомендовал сделать это:

// Create a random seed value, making it almost impossible to 
// determine what is being tested for.
var prevent_bust = Math.random() * 3000; 

// enclose everything in a function, so that it cannot be addressed
function iniFunc ( init ) { 
    // The function is no longer in scope of the main window.
    function onbeforeunload() { prevent_bust++ }
    window.onbeforeunload = onbeforeunload;
    setInterval( function() {
        // make sure the function was not deleted.
        if( window.onbeforeunload != onbeforeunload )
        {
            prevent_bust = init + 1;
            window.onbeforeunload = onbeforeunload;
        }
        if (prevent_bust > init ) {  // All comparison is to the random seed.
            prevent_bust -= 2
            window.top.location = 'http://server-which-responds-with-204.com/' 
            // Unfortunately, you have absolutely no idea which website caused
            // the incrementation, so you cannot replace it with a link!
            //
            // You might try to simply ignore it and just use the iframe as is -- 
            // theoretically, they are no longer able to bust this frame. 
            // (this theory will be disproved below).
       }
   }, 1 );
};
iniFunc( prevent_bust );

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

// setTimeout will return the highest timeout which is not "in use", in this case,
// it will be the original setInterval (from the above function) + 1.
// Event if there are 1,000 intervals already set, it will be rather trivial to 
// clear them all.
var currentInterval = 10000;
// window.setTimeout( gotoHREF, 100 );

// clearInterval will not interfere with setTimeout, so we can clear all
// of the Intervals already set.
for( var i = 0; i < currentInterval; i++ ) top.clearInterval( i );

function gotoHREF(){
    top.location.href = "http://<my-url/>";
}

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

// In php
$dd = new DOMDocument();
// file_get_contents will simply convert the entire web address into a String
$dd->loadXML( file_get_contents( "http://" . $_GET[ 'loadedURL' ] ) );
$scripts = $dd->getElementsByTagName( "script" );

// iterate through the website and remove all script tags.
for( $i = 0; $i < $scripts->length; $i++ )
{
    $current = $scripts->item( $i );
    $current->parentNode->removeChild( $current );
}

// output it to the dummy page.
echo $dd->saveXML();

Затем вы должны использовать тег:

<iframe src="redirect.php?loadedURL=http://www.google.com"></iframe>

К сожалению, это будет означать, что ваш iframe будет работать без JavaScript, что может вывести из строя, если не полностью лоботомировать данный веб-сайт. Вам также необходимо убедиться, что все атрибуты src правильно изменены для узлов-потомков в HTML стороннего сайта.

С другой стороны, вы можете попросить ваш сервер проверить сайт во фрейме и все его JS-страницы на предмет соответствия посмотрите, существует ли верхнее (. | [\ s * ("| ')) место регулярного выражения (оно будет соответствовать top.location, top [" location и top [' location)] (или есть ли вообще какие-либо ссылки на top ), а затем используйте ссылку, если она существует, и собственно сайт, если ее нет. Ущерб здесь заключается в том, что вы заставляете пользователя дважды ждать загрузки вторичного сайта - один раз на сервере и один раз в браузере. (если все не делается через JS, но это, на мой взгляд, более раздражает).

Лично я придерживаюсь мнения, что толпа «не создавайте фрейм для моего сайта» обычно может выиграть большинство сражений, в которых участвуют iframe напрямую. С другой стороны, если код используется для обработки HTML до того, как он будет добавлен на веб-страницу, то у другой стороны больше, чем шанс.



Кстати, все это можно сделать с помощью JavaScript и AJAX, но обычно это будет немного медленнее. Если можете, воспользуйтесь сервером.

16
ответ дан 1 December 2019 в 12:01
поделиться

Вы можете попытаться создать прерыватель блокировки кадров, все описано Джеффом Этвудом в его сообщении в блоге: We Done Been ... Framed! - coddinghorror.com

Короче говоря, вы должны реализовать что-то вроде этого:

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' 
    // replace your iframe with link to it
  }  
}, 1) 
3
ответ дан 1 December 2019 в 12:01
поделиться
Другие вопросы по тегам:

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