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

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

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

Есть ли способ отключить это или каким-либо образом обойти его?

В iframe нет атрибута src, и содержимое устанавливается с помощью:

frame.open();
frame.write(html);
frame.close();

Ответ 1

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

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

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

Ответ 2

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

Лучшее решение, которое я создал, - просто использовать 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 -that). сказать не входя ни в какую систему).

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

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

Ответ 3

Я знаю, что это старый пост, но другим решением будет использование 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>

Это всего лишь пример MINIMAL, чтобы проиллюстрировать эту идею: она не дезинфицирует URL-адрес и не позволяет кому-то другому использовать redirect.php для своих целей. Рассмотрим эти вещи в контексте вашего собственного сайта.

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

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

Ура!

Ответ 5

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

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

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

Ответ 6

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

Почему?

Если вы открыли какую-либо страницу из Google, вы обнаружите, что в заголовке есть поле x-frame-options. Google response header

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

(Цитата из MDN)

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

Ниже приведены мои решения этой проблемы:

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

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

Ответ 7

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

scrapedcontent.php:

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

index.html

<iframe src="scrapedcontent.php"></iframe>

Ответ 8

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

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

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