2017-01-08 2 views
1

Я бы хотел загрузить внешние веб-сайты в iframe, и если какой-либо из этих сайтов использует использование блока блокировки кадров, я хотел бы перенаправить пользователя на страницу с ошибкой. Там было несколько предложенных способов сделать это:Обнаружение, если iframe src является отображаемым

  • ждать таймаута OnLoad
  • увидеть, если содержимое IFrame ЦСИ HTML являются «пустой» после того, как он загружает
  • Попробуйте поймать ошибку
  • Поддерживайте база данных «занесенных в черный список» URL-адресов

До сих пор удручающе, у меня была самая удача с последним предметом. Другие методы не работают по следующим причинам:

  • ждет тайм-аут OnLoad:
    • OnLoad событий огонь даже с сайтов, которые используют кадр убийц. Например, если я попытаюсь получить доступ к www.google.com, он просто загрузит пустую структуру html.
  • увидеть, если содержимое IFrame ЦСИ HTML являются «пустой» после того, как он загружает
    • Вы не может получить доступ к внешнему содержимому ГКЗА в IFRAME из-за ту же политику происхождения.
  • Попытка поймать ошибку:
    • В моем понимании я могу найти только функцию обработки ошибок, которые относятся к ошибкам, вытекающим из вашего локального кода JS, и ничего, связанная с ошибками, как "Refused to display <URL> in a frame because it set 'X-Frame-Options' to 'SAMEORIGIN'/'DENY'".
  • Ведение базы данных «черный список» URL:
    • Это, очевидно, плохое решение, это некомплексность и большой список ха-ха.

Может быть, я недоразумение один из этих методов. Есть ли решение, в котором я отсутствует? Для контекста я делаю это в основном в JS + jQuery.

+1

Провел много часов по этому же самому вопросу один раз и так и не нашел решения. Любопытно, если кто-то появится – charlietfl

+0

Хотя одна вещь, которую я никогда не делал, - это использовать скрипт на стороне сервера, чтобы сделать запрос на голову. Это может быть что-то стоящее. – charlietfl

+0

Хмм, это действительно стоит –

ответ

0

У меня есть временное исправление, которое использует информацию заголовка, как предлагалось @charlietfl, хотя это не идеально, как вы можете видеть в разделе тестов, а не все сайты перечисляют варианты х-кадров в своих заголовках.

<?php 

// checkXFO 
// checks x-frame options 
// $headers: an array of headers 
// returns: nothing 
function checkXFO($headers){ 
    if($headers['X-Frame-Options']==""){ 
     echo "good to embed! <p>"; 
    } 
    else{ 
     echo "Denied! <p>"; 
    } 
} 

//----------------------- 
// tests 
//----------------------- 

// x-frame option: SAMEORIGIN 
// should deny 
// > passes 
$headerArray = get_headers('http://www.google.com',1); 
checkXFO($headerArray); 

// x-frame option: DENY 
// should deny 
// > passes 
$headerArray = get_headers('http://www.facebook.com',1); 
checkXFO($headerArray); 

//x-frame option: none 
// should accept 
// > passes 
$headerArray = get_headers('http://wikipedia.org',1); 
checkXFO($headerArray); 

//x-frame option: none 
// should accept 
// > passes 
$headerArray = get_headers('http://neopets.com',1); 
checkXFO($headerArray); 

//x-frame options: DENY 
// should deny 
// > fails 
$headerArray = get_headers('http://www.yahoo.com',1); 
checkXFO($headerArray); 

//x-frame option:none. Redirected x-frame options: DENY 
// should deny 
// > fails 
$headerArray = get_headers('http://www.yahoo.ca',1); 
checkXFO($headerArray); 
?>