it-roy-ru.com

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

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

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

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

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

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

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

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

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

25
panpernicek

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

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

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

126
Matthew Peters

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

Ура!

25
David R.

добавить <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

9
user2523022

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

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

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

7
Addeladde

Использование 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

5
David Guan

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

scrapedcontent.php:

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

index.html:

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

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

Например, я хотел бы посмотреть ngrok и mitmproxy для этого, так как они маленькие и простые в настройке (хотя обычно предназначены для немного других целей).

1
tanius