Як дозволити вміст http у iframe на веб-сайті https


145

Я завантажую деякий HTML в iframe, але коли для файлу, на який посилається, використовується http, а не https, я отримую таку помилку:

[заблоковано] Сторінка на {current_pagename} запускає незахищений вміст від {referenced_filename}

Чи є спосіб вимкнути це чи будь-який спосіб його обійти?

У iframe немає srcатрибуту, а вміст встановлюється за допомогою:

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


зробив правку. Src не встановлений, оскільки вміст записується в iframe
georgephillips

1
Дякую за всі відповіді. Довга коротка історія - це проксі-вміст.
georgephillips

@georgephillips Ви поділилися б кодом для доступу до вмісту?
Gintas_

Відповіді:


28

Виходячи із загальності цього питання, я думаю, що вам потрібно буде встановити власний проксі HTTPS на якомусь сервері в Інтернеті. Виконайте наступні дії:

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

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


1
Це не спрацює, оскільки багато сторінок, що знаходяться за рамкою iframe, не хочуть вставлятись у рамку iframe і, таким чином, встановлювати заголовок X-Frame-Options на SAMEORIGIN. Навіть якщо вам вдасться обійти це за допомогою проксі, сторінка спробує завантажити щось на кшталт /insecurepage.css, і ваш браузер запитає вашdomain / insecurepage.css
антидот

135

Примітка. Хоча це рішення, можливо, працювало в деяких браузерах, коли воно було написане у 2014 році, воно більше не працює. Навігація або переадресація до 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 Це кадр, що посилається на ...

    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
Чудова відповідь, дякую. Тільки щоб повідомити вас у хромі, метод переадресації JS не працює, просто запобігає змінам (як це робиться, коли ви намагаєтеся завантажити його нормально).
georgephillips

9
Трюк переадресації, здається, працює лише у Firefox. Chrome все ще заперечує завантаження незахищеного вмісту. Чи є інші відомі способи вирішення?
Andreas Gohr

47
Просто хотілося повідомити, що метод "Створіть власний скрипт переспрямування на https-сторінці, яку ви контролюєте", більше не працює з поточними версіями Chrom (e | ium) та Firefox, навіть використовуючи JS.
-nawao

17
Ця відповідь на сьогодні недійсна для будь-яких інших рішень
самд

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.comякий називається SSL. Я вкладаю 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
Сібідхаран

1
Посилання не може бути відносним, якщо ви хочете, щоб це працювало. Іншими словами, вкажіть повну URL-адресу в межах href. Якщо це динамічно, є бібліотеки, які захоплюють кожен сегмент URL-адреси в Javascript, а також на стороні сервера.
Ентоні Мейсон

css цільового сайту під iframe порушено. Будь ласка, перевірте
Раджу вашПепе

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


23
Це рішення не дозволяє вам розміщувати вміст http на веб-сайті https. Все це змушує http-запити як https-запити. Якщо ресурс не існує на https, ви отримаєте помилку 404.
Фелікс

Це насправді працює принаймні для моїх потреб .. протестував його за допомогою firefox та підтвердив роботу. Моя проблема - це вихідна URL-адреса, яка не відповідає HTTPS, поки мій власний веб-сайт використовує HTTPS.
Фернан Вечіна

Працює як шарм у хромі Версія 76.0.3809.132 (Офіційна збірка)
Мохамед Ажаруддін

8

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

Один із способів зробити це - завантажити сторону сервера вмісту та зберегти зображення та інші речі на своєму сервері та відобразити їх із https.

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


якщо ви скребте вміст і покажете його на своєму сайті, це завжди є ризик перехресних сценаріїв. Тож рішенням бога є скребли вміст на окремій URL-адресі та подання даних у iframe з цього URL-адреси з https. Таким чином ви запобігаєте розшифровці сценаріїв на своєму майданчику та викрадення сесії.
Addeladde

6

Використання Google як проксі-сервера на даний момент не працює,

Чому?

Якщо ви відкрили будь-яку сторінку з 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= evidenceYourHttpLink] .

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

Це працювало для мене.

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


Де ви намагаєтесь ним скористатися.
Star TechTricks

Це не працює.
EgoPingvina

1

Використовуйте власний зворотний проксі HTTPS-HTTP.

Якщо у вашому випадку використовується декілька, рідко змінюються URL-адреси для вбудовування в них iframe, ви можете просто встановити зворотний проксі-сервер для цього на власному сервері та налаштувати його так, що одна httpsURL-адреса на вашому сервері відображається на однуhttp URL-адресі проксі-сервера. Оскільки зворотний проксі повністю знаходиться на сервері, браузер не може виявити, що він "розмовляє" лише з проксі-сервером реального веб-сайту, і, таким чином, не буде скаржитися, оскільки з'єднання з проксі належним чином використовує SSL.

Якщо ви, наприклад, використовуєте Apache2 як веб-сервер, перегляньте ці вказівки для створення зворотного проксі.


1
mitmproxyє інструментом налагодження, а не виробничою системою. ngrokце послуга тунелювання, в основному для серверів розробки, я не розумію, як це може бути корисним для цього.
колен

@kolen Йдеться не про інструменти, а про ідею використання зворотного проксі-сервера для цього, про що ще не говорилося в інших відповідях. Перехід на Apache зараз, це набагато більш поширений спосіб зробити зворотний проксі.
таніус
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.