Ich lade etwas HTML in einen iframe, aber wenn eine Datei, auf die verwiesen wird, http und nicht https verwendet, wird der folgende Fehler angezeigt:
[blockiert] Auf der Seite unter {current_pagename} wurde unsicherer Inhalt von {referenced_filename} ausgeführt.
Gibt es eine Möglichkeit, dies auszuschalten oder umzugehen?
Der iframe hat kein src
Attribut und der Inhalt wird gesetzt mit:
frame.open();
frame.write(html);
frame.close();
Aufgrund der allgemeinen Bedeutung dieser Frage müssen Sie auf einigen Servern online einen eigenen HTTPS-Proxy einrichten. Führen Sie die folgenden Schritte aus:
Wenn Sie Inhalte von Remote-Sites einfach über file_get_contents oder ähnliches herunterladen, können Sie immer noch unsichere Links zu Inhalten haben. Sie müssen sie mit Regex finden und auch ersetzen. Bilder sind schwer zu lösen, aber eine Problemumgehung finden Sie hier: http://foundationphp.com/tutorials/image_proxy.php
Hinweis: Diese Lösung hat möglicherweise in einigen Browsern funktioniert, als sie 2014 geschrieben wurde. Sie funktioniert jedoch nicht mehr. Das Navigieren oder Umleiten zu einer HTTP-URL in einem
iframe
, das in eine HTTPS-Seite eingebettet ist, ist in modernen Browsern nicht zulässig, selbst wenn der Frame mit einer HTTPS-URL begann.
Die beste Lösung, die ich erstellt habe, ist, einfach Google als SSL-Proxy zu verwenden ...
https://www.google.com/search?q=%http://yourhttpsite.com&btnI=Im+Feeling+Lucky
Getestet und funktioniert in Firefox.
Andere Methoden:
Verwenden Sie einen Drittanbieter wie embed.ly (der jedoch nur für bekannte http-APIs geeignet ist).
Erstellen Sie Ihr eigenes Weiterleitungsskript auf einer von Ihnen gesteuerten https-Seite (eine einfache Javascript-Weiterleitung auf einer relativ verlinkten Seite sollte den Trick tun. Etwas wie: (Sie können eine beliebige Sprache/Methode verwenden)
https://example.com
Das hat einen Iframe-Link zu ...
https://example.com/utilities/redirect.html
Welches hat ein einfaches js Redirect-Skript wie ...
document.location.href ="http://thenonsslsite.com";
Alternativ können Sie einen RSS-Feed hinzufügen oder einen Reader/Parser schreiben, um die http-Site zu lesen und auf Ihrer https-Site anzuzeigen.
Sie könnten/sollten dem http-Site-Eigentümer auch empfehlen, eine SSL-Verbindung herzustellen. Wenn aus keinem anderen Grund als es erhöht SEO .
Sofern Sie den http-Websitebesitzer nicht dazu bringen können, ein SSL-Zertifikat zu erstellen, besteht die sicherste und dauerhafteste Lösung darin, einen RSS-Feed zu erstellen, der den benötigten Inhalt aufnimmt (vermutlich tun Sie auf der http-Website gar nichts, was zu tun ist) sagen wir, dass Sie sich nicht bei einem System anmelden).
Das eigentliche Problem ist, dass das Vorhandensein von http-Elementen auf einer https-Site ein Sicherheitsproblem darstellt. Es gibt keine völlig koscheren Möglichkeiten, um dieses Sicherheitsrisiko zu umgehen.
Beachten Sie, dass Sie diese Sicherheitsmaßnahme in den meisten Browsern deaktivieren können (selbst, nicht für andere). Beachten Sie auch, dass diese "Hacks" mit der Zeit veraltet sein können.
Ich weiß, dass dies ein alter Beitrag ist, aber eine andere Lösung wäre die Verwendung von cURL, zum Beispiel:
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;
}
dann in Ihrem Iframe-Tag, etwas wie:
<iframe src="/redirect.php?url=http://www.example.com/"></iframe>
Dies ist nur ein minimales Beispiel, um die Idee zu veranschaulichen - es bereinigt weder die URL, noch würde es jemanden davon abhalten, die redirect.php für seine eigenen Zwecke zu verwenden. Betrachten Sie diese Dinge im Kontext Ihrer eigenen Website.
Der Vorteil ist jedoch, dass es flexibler ist. Sie können beispielsweise einige Überprüfungen der gelockten $ -Daten hinzufügen, um sicherzustellen, dass sie wirklich Ihren Wünschen entsprechen, bevor Sie sie anzeigen. Testen Sie beispielsweise, ob es sich um eine 404 handelt, und halten Sie ggf. eigene alternative Inhalte bereit ist.
Plus - ich bin es ein bisschen leid, mich auf Javascript-Weiterleitungen für alles Wichtige zu verlassen.
Prost!
hinzufügen <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
im Kopf
referenz: http://thehackernews.com/2015/04/disable-mixed-content-warning.html
browserkompatibilität: http://caniuse.com/#feat=upgradeinsecurerequests
In den meisten Browsern werden Sie immer vor blockiertem Inhalt gewarnt, wenn Sie versuchen, nicht sicheren Inhalt auf einer https-Seite anzuzeigen. Dies ist schwierig, wenn Sie Inhalte von anderen Sites einbetten möchten, die nicht hinter ssl stehen. Sie können die Warnungen deaktivieren oder die Blockierung in Ihrem eigenen Browser entfernen, aber für andere Besucher ist dies ein Problem.
Eine Möglichkeit besteht darin, die Content-Server-Seite zu laden, die Bilder und andere Dinge auf Ihrem Server zu speichern und sie über https anzuzeigen.
Sie können auch versuchen, einen Dienst wie embed.ly zu verwenden und den Inhalt über diesen Dienst abzurufen. Sie haben Unterstützung, um den Inhalt hinter https zu bekommen.
Die Verwendung von Google als SSL-Proxy funktioniert derzeit nicht.
Wenn Sie eine Seite von Google aus geöffnet haben, finden Sie dort ein x-frame-options
Feld in der Kopfzeile.
Der HTTP-Antwortheader von X-Frame-Options kann verwendet werden, um anzugeben, ob ein Browser eine Seite in einem
<frame>
,<iframe>
oder<object>
. Websites können auf diese Weise Clickjacking-Angriffe vermeiden, indem sichergestellt wird, dass deren Inhalt nicht in andere Websites eingebettet ist.
(Zitat aus MDN)
Unten ist meine Arbeit für dieses Problem:
Laden Sie den Inhalt in AWS S3 hoch, und es wird ein https-Link für die Ressource erstellt.
Hinweis: Legen Sie die Berechtigung für die HTML-Datei fest, damit jeder sie anzeigen kann.
Danach können wir es als src
von iframe auf den https-Websites verwenden.
Sie könnten versuchen, alles, was Sie brauchen, mit PHP oder einer anderen serverseitigen Sprache zu scrappen und dann den iframe auf den scrapten Inhalt zu setzen. Hier ein Beispiel mit PHP:
scrapedcontent.php:
<?php
$homepage = file_get_contents('http://www.example.com/');
echo $homepage;
?>
index.html:
<iframe src="scrapedcontent.php"></iframe>
Wenn es sich um einige wenige und selten zu ändernde URLs handelt, die in iframe
eingebettet werden sollen, können Sie auf Ihrem eigenen Server einen SSL-Proxy dafür einrichten und diesen so konfigurieren, dass eine https
URL auf Ihrem Server zugeordnet wird zu einer http
URL auf dem Proxy-Server.
Zum Beispiel würde ich nach ngrok und mitmproxy suchen, da sie klein und einfach zu konfigurieren sind (obwohl sie normalerweise für etwas andere Zwecke gedacht sind).