Как разрешить http контент внутри iframe на сайте https

145

Я загружаю некоторый HTML в iframe, но когда файл, на который ссылаются, использует http, а не https, я получаю следующую ошибку:

[заблокировано] Страница с именем {current_pagename} запускала небезопасный контент из {referenced_filename}

Есть ли способ отключить это или как-то обойти это?

У iframe нет srcатрибута, и его содержимое задается с помощью:

frame.open();
frame.write(html);
frame.close();
georgephillips
источник
сделал редактирование. Src не установлен, так как содержимое записано в iframe
georgephillips
1
Спасибо за ответы на все вопросы. Короче говоря, прокси содержание.
georgephillips
@georgephillips Не могли бы вы поделиться кодом для передачи контента?
Gintas_

Ответы:

28

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

  • Подготовьте свой прокси-сервер - установите IIS, Apache
  • Получите действительный SSL-сертификат, чтобы избежать ошибок безопасности (например, на сайте openssl.com)
  • Напишите обертку, которая будет загружать небезопасный контент (как ниже)
  • С вашего сайта / приложения получите https://yourproxy.com/?page=http://insecurepage.com

Если вы просто загружаете контент с удаленного сайта с помощью file_get_contents или similiar, у вас все равно могут быть небезопасные ссылки на контент. Вы должны найти их с помощью регулярных выражений, а также заменить. Изображения трудно решить, но я нашел обходной путь здесь: http://foundationphp.com/tutorials/image_proxy.php

panpernicek
источник
1
Это не будет работать, так как многие страницы позади iframe не хотят встраиваться в iframe и поэтому устанавливают заголовок X-Frame-Options в SAMEORIGIN. Даже если вы в состоянии обойти это , используя прокси - сервер, страница будет пытаться загрузить что - то вроде /insecurepage.css и ваш браузер будет запрашивать ваш_домен / insecurepage.css
противоядие
135

Примечание. Хотя это решение могло работать в некоторых браузерах, когда оно было написано в 2014 году, оно больше не работает. Навигация или перенаправление на URL-адрес HTTP во iframeвстроенной в HTTPS-странице не разрешены современными браузерами, даже если кадр начинался с HTTPS-URL.

Лучшее решение, которое я создал, - это просто использовать Google в качестве ssl-прокси ...

https://www.google.com/search?q=%http://yourhttpsite.com&btnI=Im+Feeling+Lucky

Проверено и работает в Firefox.

Другие методы:

  • Используйте стороннее устройство, такое как embed.ly (но это хорошо только для хорошо известных http API).

  • Создайте свой собственный скрипт перенаправления на странице https, которой вы управляете (простое перенаправление javascript на относительной связанной странице должно помочь. Что-то вроде: (вы можете использовать любой язык / метод)

    https://example.com Это имеет iframe ссылку на ...

    https://example.com/utilities/redirect.html Который имеет простой скрипт перенаправления JS, как ...

    document.location.href ="http://thenonsslsite.com";

  • Кроме того, вы можете добавить RSS-канал или написать какой-нибудь читатель / парсер, чтобы прочитать сайт http и отобразить его на своем сайте https.

  • Вы можете / должны также порекомендовать владельцу http-сайта создать ssl-соединение. Если ни по какой другой причине, чем это увеличивает SEO .

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

Реальная проблема заключается в том, что наличие элементов http внутри сайта https представляет проблему безопасности. Не существует абсолютно кошерных способов обойти эту угрозу безопасности, поэтому вышесказанное - это просто обходные пути.

Обратите внимание, что вы можете отключить эту меру безопасности в большинстве браузеров (самостоятельно, а не для других). Также обратите внимание, что эти «хаки» могут со временем устареть.

Мэтью Питерс
источник
10
Отличный ответ, спасибо. Просто чтобы вы знали, что в chrome метод JS redirect не работает, просто предотвращает изменение (как это происходит при обычной загрузке).
Георгифиллипс
9
Трюк с перенаправлением работает только в Firefox. Chrome по-прежнему запрещает загрузку небезопасного содержимого. Есть ли другие известные обходные пути?
Андреас Гур
47
Просто хотел сообщить, что метод «Создайте свой собственный скрипт перенаправления на странице https, которой вы управляете» больше не работает с текущими версиями Chrom (e | ium) и Firefox, даже с использованием JS.
-Навао
17
Этот ответ недействителен на сегодняшний день, любые другие решения
samdd
22
Ответ должен иметь возможность помечаться как «устарел». Это создает путаницу, если вы не прочитали все комментарии.
Нитин,
28

Я знаю, что это старый пост, но другим решением было бы использовать cURL, например:

redirect.php:

<?php
if (isset($_GET['url'])) {
    $url = $_GET['url'];
    $ch = curl_init();
    $timeout = 5;
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    $data = curl_exec($ch);
    curl_close($ch);
    echo $data;
}

затем в вашем теге iframe, что-то вроде:

<iframe src="/redirect.php?url=http://www.example.com/"></iframe>

Это просто МИНИМАЛЬНЫЙ пример, чтобы проиллюстрировать идею - он не дезинфицирует URL и не помешает кому-либо еще использовать redirect.php для своих собственных целей. Рассмотрите эти вещи в контексте вашего собственного сайта.

Плюс в том, что он более гибкий. Например, вы можете добавить некоторую проверку данных curl'd $, чтобы убедиться, что это действительно то, что вам нужно, прежде чем отображать их - например, проверить, чтобы убедиться, что это не 404, и иметь свой собственный альтернативный контент, если он готов. является.

Плюс - я немного устал от того, что полагаюсь на перенаправления Javascript для чего-то важного.

Ура!

Дэвид Р.
источник
4
Это довольно эффективно, но ссылки внутри сайта становятся недействительными. Например, у меня есть домен с именем example.comSSL. Я встраиваю iframe, с example.netкоторым не имеет SSL. У example.comссылки есть ссылка, href="https://stackoverflow.com/path/file.html"и при ее нажатии она открывается, а https://example.com/path/file.htmlнеhttp://example.net/path/file.html
Sibidharan
1
Ссылка не может быть относительной, если вы хотите, чтобы это работало. Другими словами, укажите полный URL-адрес в разделе href. Если это динамично, есть библиотеки, чтобы захватить каждый сегмент URL в Javascript, а также на стороне сервера.
Энтони Мейсон,
CSS целевого сайта в iframe не работает. Пожалуйста, проверьте
Raju yourPepe
14

добавить <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">в голову

ссылка: http://thehackernews.com/2015/04/disable-mixed-content-warning.html

совместимость браузера: http://caniuse.com/#feat=upgradeinsecurerequests

user2523022
источник
23
Это решение не позволяет размещать контент http на сайте https. Все, что это делает, это форсирует запросы http как запросы https. Если ресурс не существует на https, вы просто получите ошибку 404.
Феликс
Это на самом деле работает, по крайней мере, для моих нужд ... протестировал его с Firefox и подтвердил работу. Моя проблема в том, что исходный URL не соответствует HTTPS, в то время как мой собственный сайт использует HTTPS.
Фернан Вечина
Работает как charm in chrome Версия 76.0.3809.132 (Официальная сборка)
Мохамед Ажаруддин
8

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

Один из способов сделать это - загрузить сторону контент-сервера, сохранить изображения и другие вещи на свой сервер и отобразить их из https.

Вы также можете попробовать использовать такой сервис, как embed.ly, и получить через них контент. У них есть поддержка для получения контента за https.

Addeladde
источник
Если вы просматриваете контент и показываете его на своем сайте, это всегда риск межсайтового скриптинга. Таким образом, наилучшее решение состоит в том, чтобы собрать содержимое на отдельном URL и представить данные в iframe из этого URL с помощью https. Таким образом, вы предотвращаете межсайтовый скриптинг на своем сайте и перехват сеансов.
Addeladde
6

Использование Google в качестве SSL-прокси в настоящее время не работает,

Зачем?

Если вы открыли какую-либо страницу из Google, вы найдете x-frame-optionsполе в заголовке. Заголовок ответа Google

X-Frame-Options HTTP - заголовок ответа может быть использован , чтобы указать , должен ли браузер разрешено отобразить страницу в <frame>, <iframe>или <object>. Сайты могут использовать это, чтобы избежать атак с использованием кликов, гарантируя, что их контент не будет встроен в другие сайты.

(Цитата из MDN)

Одно из решений

Ниже моя работа вокруг этой проблемы:

Загрузите контент в AWS S3, и он создаст ссылку https для ресурса.
Примечание: установите разрешение для html-файла, чтобы все могли его просматривать.

После этого мы можем использовать его как srciframe на веб-сайтах https. AWS

Дэвид Гуан
источник
2

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

scrapedcontent.php:

<?php
$homepage = file_get_contents('http://www.example.com/');
echo $homepage;
?>

index.html:

<iframe src="scrapedcontent.php"></iframe>
Грант
источник
3
Как вы будете обрабатывать изображения, включая файлы JS и CSS, гиперссылки и запросы AJAX?
dotancohen
@dotancohen вы правы, это не идеальное решение, но я думаю, что это лучшее для этой ситуации. На некоторых сайтах вы не столкнетесь с проблемами, которые вы обсуждали.
Грант
1
Это работает, но эффективно удваивает загрузку контента и, следовательно, время загрузки, когда ваш сервер очищает, а затем повторно подает контент ...
ChristoKiwi
2

Все, что вам нужно сделать, это просто использовать Google в качестве прокси-сервера.

https://www.google.ie/gwt/x?u=[YourHttpLink] .

<iframe src="https://www.google.ie/gwt/x?u=[Your http link]"></frame>

Это сработало для меня.

Кредиты: - https://www.wikihow.com/Use-Google-As-a-Proxy

Star TechTricks
источник
Где вы пытаетесь использовать это.
Звезда TechTricks
Это не работает.
ЭгоПингвина
1

Используйте свой собственный обратный прокси-сервер HTTPS-HTTP.

Если в вашем случае используется несколько редко меняющихся URL-адресов для встраивания iframe, вы можете просто настроить обратный прокси-сервер для этого на своем собственном сервере и настроить его так, чтобы один httpsURL-адрес на вашем сервере соответствовал одномуhttp URL-адресу на проксируемом сервере. Поскольку обратный прокси-сервер полностью находится на стороне сервера, браузер не может обнаружить, что он «только» общается с прокси-сервером реального веб-сайта, и, таким образом, не будет жаловаться, поскольку соединение с прокси-сервером использует SSL должным образом.

Например, если вы используете Apache2 в качестве веб-сервера, см. Эти инструкции для создания обратного прокси-сервера.

tanius
источник
1
mitmproxyявляется средством отладки, а не системой проксирования продукции. ngrokэто сервис туннелирования, в основном для серверов разработки, я не понимаю, как это может быть полезно для этого.
Колен
@kolen Речь идет не об инструментах, а об идее использования обратного прокси-сервера, о котором пока не упоминалось в других ответах. Теперь перейдем на Apache, который является гораздо более распространенным способом создания обратного прокси.
Tanius