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

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

[blocked] The page at {current_pagename} run insecure content from {referenced_filename}

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

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

frame.open();
frame.write(html);
frame.close();
Комментарии к вопросу (4)

Примечание: Хотя это решение могло работать в некоторых браузерах, когда оно было написано в 2014 году, оно больше не работает. Переход или перенаправление на HTTP URL в 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-сайта представляет собой проблему безопасности. Не существует абсолютно кошерных способов обойти этот риск безопасности, поэтому вышеперечисленные способы являются лишь текущими обходными путями.

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

Комментарии (17)

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

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

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

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

Приветствия!

Комментарии (3)
Решение

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

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

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

Комментарии (1)

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

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

Комментарии (5)

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

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

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

Комментарии (1)

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

Почему?

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

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

(Цитата из MDN)

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

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

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

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

Комментарии (0)

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

scrapedcontent.php:

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

index.html:

Комментарии (3)

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

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

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

Комментарии (2)