Jak zezwolić na zawartość http w elemencie iframe w witrynie https

145

Ładuję kod HTML do elementu iframe, ale gdy plik, do którego się odwołuje, używa protokołu http, a nie https, pojawia się następujący błąd:

[zablokowano] Strona pod adresem {current_pagename} zawiera niezabezpieczone treści z {referenced_filename}

Czy jest jakiś sposób, aby to wyłączyć lub jak to obejść?

Element iframe nie ma srcatrybutu, a zawartość jest ustawiana za pomocą:

frame.open();
frame.write(html);
frame.close();
georgephillips
źródło
dokonał edycji. Źródło nie jest ustawione, ponieważ zawartość jest zapisywana w
ramce
1
Dzięki za wszystkie odpowiedzi. Krótko mówiąc, jest proxy treści.
georgephillips
@georgephillips czy udostępniłbyś kod do proxy zawartości?
Gintas_

Odpowiedzi:

28

Opierając się na ogólności tego pytania, myślę, że będziesz musiał skonfigurować własne proxy HTTPS na jakimś serwerze online. Wykonaj następujące kroki:

  • Przygotuj serwer proxy - zainstaluj IIS, Apache
  • Uzyskaj ważny certyfikat SSL, aby uniknąć błędów bezpieczeństwa (na przykład bezpłatnie ze startssl.com)
  • Napisz opakowanie, które będzie pobierać niezabezpieczone treści (jak to zrobić poniżej)
  • Ze swojej witryny / aplikacji uzyskaj https://yourproxy.com/?page=http://insecurepage.com

Jeśli po prostu pobierzesz zawartość witryny zdalnej za pośrednictwem pliku_get_contents lub podobnego, nadal możesz mieć niezabezpieczone linki do treści. Musisz je znaleźć za pomocą wyrażenia regularnego, a także zamienić. Obrazy są trudne do rozwiązania, ale Ï znalazłem obejście tutaj: http://foundationphp.com/tutorials/image_proxy.php

panpernicek
źródło
1
To nie zadziała, ponieważ wiele stron znajdujących się za iframe nie chce być osadzone w iframe i dlatego ustawia X-Frame-Options Header na SAMEORIGIN. Nawet jeśli możesz to ominąć za pomocą serwera proxy, strona spróbuje załadować coś takiego jak /insecurepage.css, a twoja przeglądarka zażąda twojej domeny / insecurepage.css
antidotum
135

Uwaga: chociaż to rozwiązanie mogło działać w niektórych przeglądarkach, gdy zostało napisane w 2014 roku, już nie działa. Nawigacja lub przekierowanie do adresu URL HTTP na stronie iframeosadzonej na stronie HTTPS nie jest dozwolone przez nowoczesne przeglądarki, nawet jeśli ramka zaczynała się od adresu URL HTTPS.

Najlepszym rozwiązaniem, które stworzyłem, jest użycie google jako proxy ssl ...

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

Przetestowane i działa w przeglądarce Firefox.

Inne metody:

  • Użyj strony trzeciej, takiej jak embed.ly (ale jest to naprawdę dobre tylko dla dobrze znanych interfejsów API http).

  • Utwórz własny skrypt przekierowania na stronie https, którą kontrolujesz (proste przekierowanie javascript na względnie połączonej stronie powinno załatwić sprawę. Coś w rodzaju: (możesz użyć dowolnej metody / języka)

    https://example.com To ma element iframe prowadzący do ...

    https://example.com/utilities/redirect.html Który ma prosty skrypt przekierowania js, taki jak ...

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

  • Alternatywnie możesz dodać kanał RSS lub napisać czytnik / parser, który będzie czytać witrynę http i wyświetlać ją w witrynie https.

  • Możesz / powinieneś również zalecić właścicielowi witryny http, aby utworzył połączenie ssl. Jeśli nie z innego powodu, jak tylko zwiększa seo .

O ile nie możesz nakłonić właściciela witryny http do utworzenia certyfikatu ssl, najbezpieczniejszym i najtrwalszym rozwiązaniem byłoby utworzenie kanału RSS przechwytującego potrzebne treści (przypuszczalnie w rzeczywistości nie `` robisz '' niczego w witrynie http - to znaczy powiedz, że nie logujesz się do żadnego systemu).

Prawdziwym problemem jest to, że posiadanie elementów http w witrynie https stanowi problem z bezpieczeństwem. Nie ma całkowicie koszernych sposobów na obejście tego zagrożenia bezpieczeństwa, więc powyższe to tylko aktualne obejścia.

Pamiętaj, że możesz wyłączyć ten środek bezpieczeństwa w większości przeglądarek (siebie, a nie innych). Należy również pamiętać, że te „hacki” mogą z czasem stać się przestarzałe.

Matthew Peters
źródło
10
Świetna odpowiedź, dzięki. Po prostu, aby poinformować Cię w chrome, że metoda przekierowania JS nie działa po prostu zapobiega zmianie (tak jak dzieje się, gdy próbujesz załadować ją normalnie).
georgephillips
9
Wydaje się, że sztuczka z przekierowaniem działa tylko w przeglądarce Firefox. Chrome nadal nie zezwala na ładowanie niezabezpieczonych treści. Czy są jakieś inne znane obejścia?
Andreas Gohr
47
Chciałem tylko zasygnalizować, że metoda „Utwórz własny skrypt przekierowania na kontrolowanej przez Ciebie stronie https” nie działa już z obecnymi wersjami Chrom (e | ium) i Firefoksa, nawet przy użyciu JS.
kako-nawao
17
Ta odpowiedź jest do tej pory nieprawidłowa, wszelkie inne rozwiązania
samdd
22
Odpowiedź powinna mieć opcję oznaczenia jako „przestarzała”. To powoduje zamieszanie, chyba że przeczytasz wszystkie komentarze.
Nitin
28

Wiem, że to stary post, ale innym rozwiązaniem byłoby użycie cURL, na przykład:

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;
}

następnie w tagu iframe coś takiego:

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

To tylko MINIMALNY przykład ilustrujący pomysł - nie oczyszcza adresu URL ani nie uniemożliwia komuś innemu wykorzystania redirect.php do własnych celów. Rozważ te kwestie w kontekście swojej własnej witryny.

Zaletą jest jednak to, że jest bardziej elastyczny. Na przykład, możesz dodać weryfikację danych $ curl'd, aby upewnić się, że są one naprawdę tym, czego chcesz, zanim je wyświetlisz - na przykład przetestuj, aby upewnić się, że nie jest to 404, i przygotuj własną alternatywną zawartość, jeśli tak. jest.

Plus - jestem trochę zmęczony poleganiem na przekierowaniach JavaScript w przypadku czegokolwiek ważnego.

Twoje zdrowie!

David R.
źródło
4
To całkiem działa, ale linki w witrynie stają się nieprawidłowe. Na przykład mam domenę o nazwie, example.comktóra ma SSL. Osadzam element iframe, example.netktóry nie ma SSL. example.comMa link jak href="https://stackoverflow.com/path/file.html"i podczas klikania to, to jest otwarcie jak https://example.com/path/file.htmlzamiasthttp://example.net/path/file.html
Sibidharan
1
Link nie może być względny, jeśli chcesz, aby to zadziałało. Innymi słowy, podaj pełny adres URL w href. Jeśli jest to dynamiczne, istnieją biblioteki, które pobierają każdy segment adresu URL w JavaScript, a także po stronie serwera.
Anthony Mason
css witryny docelowej w elemencie iframe jest uszkodzony. Proszę sprawdzić
Raju yourPepe
14

dodać <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">w głowie

źródło: http://thehackernews.com/2015/04/disable-mixed-content-warning.html

zgodność z przeglądarkami: http://caniuse.com/#feat=upgradeinsecurerequests

user2523022
źródło
23
To rozwiązanie nie pozwala na obsługę treści http w witrynie https. Wszystko to polega na wymuszaniu żądań http jako żądań https. Jeśli zasób nie istnieje na https, zamiast tego pojawi się błąd 404.
Felix
To faktycznie działa przynajmniej dla moich potrzeb ... przetestowałem to z Firefoxem i potwierdziłem, że działa. Mój problem polega na tym, że źródłowy adres URL nie jest zgodny z protokołem HTTPS, podczas gdy moja witryna korzysta z protokołu HTTPS.
Fernan Vecina
Działa jak urok w chrome Wersja 76.0.3809.132 (oficjalna kompilacja)
Mohamed Azharuddin
8

Zawsze będziesz otrzymywać ostrzeżenia o zablokowanych treściach w większości przeglądarek podczas próby wyświetlenia niezabezpieczonych treści na stronie https. Jest to trudne, jeśli chcesz osadzić rzeczy z innych witryn, które nie są za protokołem SSL. Możesz wyłączyć ostrzeżenia lub usunąć blokowanie we własnej przeglądarce, ale dla innych odwiedzających to problem.

Jednym ze sposobów jest załadowanie strony serwera treści i zapisanie obrazów i innych rzeczy na serwerze i wyświetlenie ich z https.

Możesz także spróbować skorzystać z usługi takiej jak embed.ly i pobrać zawartość za ich pośrednictwem. Mają wsparcie dla pobierania treści za https.

Addeladde
źródło
jeśli zeskrobujesz zawartość i pokazujesz ją w swojej witrynie, zawsze istnieje ryzyko wystąpienia skryptów między witrynami. Dlatego dobrym rozwiązaniem jest pobranie zawartości z osobnego adresu URL i przedstawienie danych w ramce iframe z tego adresu URL z https. W ten sposób zapobiegasz przechwytywaniu skryptów między witrynami na głównym serwerze i przejmowaniu sesji.
Addeladde
6

Używanie Google jako serwera proxy SSL obecnie nie działa,

Czemu?

Jeśli otworzyłeś jakąkolwiek stronę z google, x-frame-optionsw nagłówku znajdziesz pole. Nagłówek odpowiedzi Google

Nagłówek odpowiedzi HTTP X-Frame-Options może służyć do wskazania, czy przeglądarka powinna mieć możliwość renderowania strony w formacie <frame>, <iframe>lub <object>. Witryny mogą to wykorzystać, aby uniknąć ataków typu clickjacking, zapewniając, że ich zawartość nie jest osadzana w innych witrynach.

(Cytat z MDN)

Jedno z rozwiązań

Poniżej znajduje się moje obejście tego problemu:

Prześlij zawartość do AWS S3 i utworzy łącze https dla zasobu.
Uwaga: ustaw uprawnienia do pliku html, aby wszyscy mogli go przeglądać.

Następnie możemy użyć go jako srcelementu iframe w witrynach https. AWS

David Guan
źródło
2

Możesz spróbować zeskrobać wszystko, czego potrzebujesz, za pomocą PHP lub innego języka po stronie serwera, a następnie umieścić ramkę iframe w pobranej zawartości. Oto przykład z PHP:

scrapedcontent.php:

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

index.html:

<iframe src="scrapedcontent.php"></iframe>
Dotacja
źródło
3
Jak poradzisz sobie z obrazami, dołączonymi plikami JS i CSS, hiperłączami i żądaniami AJAX?
dotancohen
@dotancoJeśli masz rację, to nie jest idealne rozwiązanie, ale myślę, że jest najlepsze w tej sytuacji. Niektóre witryny nie napotkają omawianych problemów.
Grant
1
To działa, ale skutecznie dwukrotnie ładuje zawartość, a tym samym ładuje czas, gdy serwer pobiera, a następnie ponownie udostępnia zawartość ...
ChristoKiwi
1

Użyj własnego zwrotnego serwera proxy HTTPS-to-HTTP.

Jeśli Twój przypadek użycia dotyczy kilku, rzadko zmieniających się adresów URL do osadzenia w iframe, możesz po prostu ustawić odwrotny serwer proxy na swoim własnym serwerze i skonfigurować go tak, aby jeden httpsadres URL na serwerze był mapowany na jeden httpadres URL na serwerze proxy. Ponieważ odwrotne proxy działa w całości po stronie serwera, przeglądarka nie może wykryć, że rozmawia „tylko” z serwerem proxy prawdziwej witryny, a zatem nie będzie narzekać, ponieważ połączenie z serwerem proxy prawidłowo korzysta z protokołu SSL.

Jeśli na przykład używasz Apache2 jako serwera internetowego, zapoznaj się z tymi instrukcjami, aby utworzyć odwrotne proxy.

tanius
źródło
1
mitmproxyjest narzędziem do debugowania, a nie produkcyjnym systemem proxy. ngrokto usługa tunelowania, głównie dla serwerów programistycznych, nie rozumiem, jak może się do tego przydać.
kolen
@kolen Nie chodzi o narzędzia, chodzi o pomysł wykorzystania do tego odwrotnego proxy, o którym jeszcze nie wspomniano w innych odpowiedziach. Zmiana teraz na Apache, która jest znacznie bardziej powszechnym sposobem wykonania odwrotnego proxy.
tanius