Come consentire il contenuto http all'interno di un iframe su un sito https


145

Carico un po 'di HTML in un iframe ma quando un file a cui si fa riferimento utilizza http, non https, viene visualizzato il seguente errore:

[bloccato] La pagina in {current_pagename} ha pubblicato contenuti non sicuri da {referenced_filename}

C'è un modo per disattivarlo o un modo per aggirarlo?

L'iframe non ha alcun srcattributo e il contenuto viene impostato usando:

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


fatto una modifica. Src non è impostato poiché il contenuto è scritto nell'iframe
georgephillips

1
Grazie per tutte le risposte Per farla breve è proxy il contenuto.
georgephillips,

@georgephillips vorresti condividere il codice per il proxy del contenuto?
Gintas_

Risposte:


28

In base alla generalità di questa domanda, penso che dovrai configurare il tuo proxy HTTPS su alcuni server online. Procedi come segue:

  • Prepara il tuo server proxy - installa IIS, Apache
  • Ottieni un certificato SSL valido per evitare errori di sicurezza (ad esempio gratuito da openssl.com)
  • Scrivi un wrapper, che scaricherà il contenuto non sicuro (come sotto)
  • Dal tuo sito / app ottieni https://yourproxy.com/?page=http://insecurepage.com

Se scarichi semplicemente il contenuto del sito remoto tramite file_get_contents o simili, puoi comunque avere collegamenti non sicuri al contenuto. Dovrai trovarli con regex e anche sostituirli. Le immagini sono difficili da risolvere, ma Ï abbiamo trovato una soluzione alternativa qui: http://foundationphp.com/tutorials/image_proxy.php


1
Questo non funzionerà, poiché molte pagine dietro iframe non vogliono essere incorporate in un iframe e quindi impostare l'intestazione X-Frame-Options su SAMEORIGIN. Anche se si è in grado di bypassare questo usando il proxy, la pagina avrebbe cercato di carico qualcosa come /insecurepage.css e il browser richiederà Dominio / insecurepage.css
antidoto

135

Nota: sebbene questa soluzione abbia funzionato in alcuni browser quando è stata scritta nel 2014, non funziona più. La navigazione o il reindirizzamento a un URL HTTP in un iframeincorporato in una pagina HTTPS non è consentito dai browser moderni, anche se il frame è iniziato con un URL HTTPS.

La migliore soluzione che ho creato è semplicemente usare google come proxy ssl ...

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

Testato e funziona su Firefox.

Altri metodi:

  • Utilizzare una terza parte come embed.ly (ma è davvero utile solo per API http ben note).

  • Crea il tuo script di reindirizzamento su una pagina https che controlli (un semplice reindirizzamento javascript su una pagina collegata relativa dovrebbe fare il trucco. Qualcosa del tipo: (puoi usare qualsiasi linguaggio / metodo)

    https://example.com Che ha un iframe che si collega a ...

    https://example.com/utilities/redirect.html Che ha un semplice script di reindirizzamento js come ...

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

  • In alternativa, puoi aggiungere un feed RSS o scrivere un lettore / parser per leggere il sito http e visualizzarlo nel tuo sito https.

  • Si potrebbe / dovrebbe anche raccomandare al proprietario del sito http di creare una connessione ssl. Se per nessun altro motivo se non aumenta seo .

A meno che tu non riesca a convincere il proprietario del sito http a creare un certificato ssl, la soluzione più sicura e permanente sarebbe quella di creare un feed RSS che raccolga il contenuto di cui hai bisogno (presumibilmente non stai realmente "facendo" nulla sul sito http, cioè dire di non accedere a nessun sistema).

Il vero problema è che avere elementi http all'interno di un sito https rappresenta un problema di sicurezza. Non ci sono modi completamente kosher per aggirare questo rischio per la sicurezza, quindi quanto sopra sono solo soluzioni alternative.

Nota che puoi disabilitare questa misura di sicurezza nella maggior parte dei browser (te stesso, non per gli altri). Si noti inoltre che questi "hack" potrebbero diventare obsoleti nel tempo.


10
Ottima risposta, grazie. Solo per farti sapere in Chrome il metodo di reindirizzamento JS non funziona semplicemente impedisce la modifica (come succede quando provi a caricarlo normalmente).
georgephillips,

9
Il trucco di reindirizzamento sembra funzionare solo in Firefox. Chrome nega ancora il caricamento dei contenuti non sicuri. Ci sono altre soluzioni alternative conosciute?
Andreas Gohr,

47
Volevo solo segnalare che il metodo "Crea il tuo script di reindirizzamento su una pagina https che controlli" non funziona più con le versioni correnti di Chrom (e | ium) e Firefox, anche usando JS.
Kako-Nawao,

17
Questa risposta non è valida fino ad oggi, qualsiasi altra soluzione
samdd

22
La risposta dovrebbe avere un'opzione per essere etichettata come "obsoleta". Crea confusione a meno che non si leggano tutti i commenti.
Nitin,

28

So che questo è un vecchio post, ma un'altra soluzione sarebbe usare cURL, ad esempio:

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

quindi nel tuo tag iframe, qualcosa del tipo:

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

Questo è solo un esempio MINIMO per illustrare l'idea: non disinfetta l'URL, né impedirebbe a qualcun altro di utilizzare redirect.php per i propri scopi. Considera queste cose nel contesto del tuo sito.

Il lato positivo, tuttavia, è che è più flessibile. Ad esempio, potresti aggiungere un po 'di convalida dei dati $ arricciati per assicurarti che sia davvero quello che vuoi prima di visualizzarli - ad esempio, prova per assicurarti che non sia un 404 e abbia un contenuto alternativo pronto se disponibile è.

Inoltre, sono un po 'stanco di fare affidamento sui reindirizzamenti Javascript per qualcosa di importante.

Saluti!


4
Funziona abbastanza, ma i link all'interno del sito non sono validi. Ad esempio, ho un dominio chiamato example.comche ha un SSL. Sto incorporando un iframe con example.netcui non ha SSL. Il example.comha un link come href="https://stackoverflow.com/path/file.html"e mentre clic su di esso, si sta aprendo come https://example.com/path/file.htmlinvecehttp://example.net/path/file.html
Sibidharan

1
Il collegamento non può essere relativo se si desidera che funzioni. In altre parole, specifica l'URL completo all'interno dell'href. Se questo è dinamico, ci sono librerie per catturare ogni segmento dell'URL in Javascript e sul lato server.
Anthony Mason,

CSS del sito di destinazione in iframe è rotto. Si prega di controllare
Raju yourPepe,

14

aggiungere <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">in testa

riferimento: http://thehackernews.com/2015/04/disable-mixed-content-warning.html

compatibilità del browser: http://caniuse.com/#feat=upgradeinsecurerequests


23
Questa soluzione non consente di pubblicare contenuti http su un sito https. Tutto ciò che fa è forzare le richieste http come richieste https. Se la risorsa non esiste su https riceverai invece un errore 404.
Felix,

Questo in realtà funziona almeno per le mie esigenze .. testato con Firefox e confermato il funzionamento. Il mio problema è che l'URL di origine non è la conformità HTTPS mentre il mio sito Web utilizza HTTPS.
Fernan Vecina,

Funziona come il fascino in versione cromata 76.0.3809.132 (build ufficiale)
Mohamed Azharuddin

8

Riceverai sempre avvisi di contenuto bloccato nella maggior parte dei browser quando provi a visualizzare contenuti non sicuri su una pagina https. Questo è complicato se vuoi incorporare cose da altri siti che non sono dietro ssl. Puoi disattivare gli avvisi o rimuovere il blocco nel tuo browser, ma per gli altri visitatori è un problema.

Un modo per farlo è caricare il lato server dei contenuti e salvare le immagini e altre cose sul server e visualizzarle da HTTPS.

Puoi anche provare a utilizzare un servizio come embed.ly e ottenere il contenuto attraverso di essi. Hanno il supporto per ottenere il contenuto dietro https.


se scarti i contenuti e li mostri sul tuo sito, c'è sempre il rischio di scripting cross site. Quindi una soluzione divina è quella di raschiare il contenuto su un URL separato e presentare i dati in un iframe da quell'URL con https. In questo modo previeni lo scripting crosssite sul tuo sito principale e il dirottamento della sessione.
Addeladde,

6

L'uso di Google come proxy SSL non funziona attualmente,

Perché?

Se hai aperto una pagina da Google, troverai un x-frame-optionscampo nell'intestazione. Intestazione della risposta di Google

L'intestazione della risposta HTTP X-Frame-Options può essere utilizzata per indicare se un browser deve essere autorizzato a eseguire il rendering di una pagina in a <frame>, <iframe>o <object>. I siti possono utilizzarlo per evitare attacchi di clickjacking, garantendo che il loro contenuto non sia incorporato in altri siti.

(Citazione da MDN)

Una delle soluzioni

Di seguito è il mio lavoro per questo problema:

Carica il contenuto su AWS S3 e creerà un collegamento https per la risorsa.
Avviso: impostare l'autorizzazione sul file html per consentire a tutti di visualizzarlo.

Successivamente, possiamo usarlo come srciframe nei siti Web https. AWS


2

Puoi provare a scartare tutto ciò di cui hai bisogno con PHP o un'altra lingua lato server, quindi inserire l'iframe nel contenuto scartato. Ecco un esempio con PHP:

scrapedcontent.php:

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

index.html:

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

3
Come gestirete le immagini, inclusi i file JS e CSS, i collegamenti ipertestuali e le richieste AJAX?
dotancohen,

@dotancohen hai ragione, non è una soluzione perfetta, ma penso che sia la migliore per questa situazione. Alcuni siti non incontreranno i problemi discussi.
Concedi il

1
Funziona, ma in realtà è il doppio caricamento del contenuto e quindi il caricamento del tempo mentre il server esegue la raschiatura e quindi ri-serve il contenuto ...
ChristoKiwi


1

Usa il tuo proxy inverso HTTPS-to-HTTP.

Se il tuo caso d'uso riguarda alcuni, che raramente cambiano gli URL da incorporare nel iframe, puoi semplicemente impostare un proxy inverso per questo sul tuo server e configurarlo in modo che un httpsURL sul tuo server sia mappato su unohttp URL sul server proxy. Poiché un proxy inverso è interamente lato server, il browser non può scoprire che sta "solo" parlando con un proxy del sito Web reale e quindi non si lamenterà poiché la connessione al proxy utilizza SSL correttamente.

Se ad esempio usi Apache2 come server web, consulta queste istruzioni per creare un proxy inverso.


1
mitmproxyè uno strumento di debug, non un sistema di proxy di produzione. ngrokè un servizio di tunneling, principalmente per server di sviluppo, non capisco come possa essere utile per questo.
Kolen,

@kolen Non si tratta degli strumenti, si tratta dell'idea di utilizzare un proxy inverso per questo, non ancora menzionato nelle altre risposte. Passare ad Apache ora, che è un modo molto più comune di fare un proxy inverso.
tanius,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.