Проверка, если веб-сайт не разрешает вставку iframe - PullRequest
8 голосов
/ 15 сентября 2011

Я пишу простой лайтбокс-плагин для своего приложения, и мне нужно встроить iframe, связанный с произвольной страницей. Проблема заключается в том, что многие веб-сайты (например, facebook , nytimes и даже stackoverflow) проверят, встроен ли он во фрейм, и, если это так, обновят страницу как родительскую. , Это известная проблема, и я не думаю, что с этим можно что-то сделать. Тем не менее, мне хотелось бы знать заранее, поддерживает ли сайт вставку или нет. Если это не так, я бы хотел открыть страницу в новой вкладке / окне вместо использования iframe.

Есть ли уловка, которая позволяет мне проверить это в JavaScript?

Может быть, существует серверный скрипт, который может проверять ссылки, чтобы узнать, разрешают ли они вставку iframe?

Я занимаюсь разработкой расширения для браузера, поэтому есть возможность сделать что-то очень креативное. Мое расширение загружается на каждую страницу, поэтому я думаю, что есть способ передать параметр в URL-адресе iframe, который может быть получен расширением, если оно уничтожает iframe. Затем я могу добавить домен в список сайтов, которые не поддерживают встраивание iframe. Это может работать, так как расширения не загружаются в iframes. Я буду работать над этим, но в то же время ....

Пояснение:

Я готов согласиться с тем, что нет никакого способа «уничтожить» «фреймбастер», т. Е. Я знаю, что не могу отобразить страницу в фрейме, который не хочет быть в ней. Но я бы хотел, чтобы мое приложение не работало корректно, что означает открытие ссылки в новом окне, если встраивание iframe не поддерживается. В идеале я хотел бы проверить поддержку встроенного iframe во время выполнения (javascript), но я вижу потенциальное решение на стороне сервера, использующее прокси, как предложено в комментариях выше. Надеюсь, я смогу создать базу данных сайтов, которые не позволяют вставлять iframe.

Ответы [ 3 ]

8 голосов
/ 06 июля 2014

Проверьте заголовок x-frame-options, используя следующий код

$url = "http://stackoverflow.com";
$header = get_headers($url, 1);
echo $header["X-Frame-Options"];

Если возвращаемое значение DENY, SAMEORIGIN или ALLOW-FROM, вы не можете использовать iframe с этим URL.

2 голосов
/ 14 февраля 2013

Возможно, довольно поздно, но вам нужно сделать запрос, скорее всего, с вашего сервера и поискать заголовок x-frame-options. Если она вообще есть, вы можете просто открыть новую вкладку, потому что, если она есть, есть одно из следующего: DENY, SAMEORIGIN, ALLOW-FROM. В любом из этих случаев вполне вероятно, что у вас нет доступа, чтобы открыть его в iframe.

1 голос
/ 15 сентября 2011

Эта тема обсуждалась в интернете всегда с особенно интересной (неудачной) попыткой здесь:

Frame Buster Buster ... необходим код ошибки Buster

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

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

Или разработайте его только для мобильных устройств ...;)

ОБНОВЛЕНИЕ: ОК, следуя вашему комментарию, приведу немного дегустатора:

в javascript захватить клик по ссылке

$("a").click(function(e){

    preventDefault(e); // make sure the click doesn't happen

    // call a server side script using ajax and pass the URL this.href
    // return either a true or false; true = iframe breakout
    // set the target attribute of the link to "_blank" for new window (if true)
    // set the target attribute of the link to "yourframename" for iframe (if false)
    // only now load the page in the new window or iframe
});

серверная часть в PHP

$d = file_get_contents($url); // $url is the url your sent from the browser
// now parse $d to find .top .parent etc... in the <head></head> block
// return true or false 
...