it-swarm.com.de

Zulassen von http-Inhalten in einem Iframe auf einer https-Site

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();
131
georgephillips

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:

  • Bereiten Sie Ihren Proxy-Server vor - installieren Sie IIS, Apache
  • Holen Sie sich ein gültiges SSL-Zertifikat, um Sicherheitsfehler zu vermeiden (z. B. kostenlos von startssl.com).
  • Schreiben Sie einen Wrapper, der unsicheren Inhalt herunterlädt (siehe unten).
  • Von Ihrer Site/App erhalten Sie https://yourproxy.com/?page=http://insecurepage.com

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

25
panpernicek

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.

128
Matthew Peters

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!

26
David R.

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

11
user2523022

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.

7
Addeladde

Die Verwendung von Google als SSL-Proxy funktioniert derzeit nicht.

Warum?

Wenn Sie eine Seite von Google aus geöffnet haben, finden Sie dort ein x-frame-options Feld in der Kopfzeile. Google response header

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)

Eine der Lösungen

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. AWS

5
David Guan

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>
2
Grant

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).

1
tanius