Como permitir conteúdo http em um iframe em um site https

145

Carrego um pouco de HTML em um iframe, mas quando um arquivo referenciado está usando http, não https, recebo o seguinte erro:

[bloqueado] A página em {current_pagename} executou conteúdo não seguro de {referenced_filename}

Existe alguma maneira de desativar isso ou alguma maneira de contornar isso?

O iframe não tem srcatributo e o conteúdo é definido usando:

frame.open();
frame.write(html);
frame.close();
georgephillips
fonte
fez uma edição. A src não está definido como o conteúdo é escrito para o iframe
georgephillips
1
Obrigado por todas as respostas. Longa história curta é proxy do conteúdo.
Georgephillips
@georgephillips você compartilharia o código para proxy do conteúdo?
Gintas_

Respostas:

28

Com base na generalidade desta pergunta, acho que você precisará configurar seu próprio proxy HTTPS em algum servidor online. Execute os seguintes passos:

  • Prepare seu servidor proxy - instale o IIS, Apache
  • Obtenha um certificado SSL válido para evitar erros de segurança (gratuito no site openssl.com, por exemplo)
  • Escreva um invólucro, que fará o download de conteúdo não seguro (como abaixo)
  • Em seu site / aplicativo, obtenha https://yourproxy.com/?page=http://insecurepage.com

Se você simplesmente baixar o conteúdo do site remoto via file_get_contents ou semelhante, ainda poderá ter links inseguros para o conteúdo. Você precisará encontrá-los com regex e também substituí-los. As imagens são difíceis de resolver, mas encontrei uma solução alternativa aqui: http://foundationphp.com/tutorials/image_proxy.php

panpernicek
fonte
1
Isso não funcionará, já que muitas páginas atrás do iframe não desejam ser incorporadas em um iframe e, portanto, defina o X-Frame-Options Header como SAMEORIGIN. Mesmo se você é capaz de contornar isso usando o proxy, a página iria tentar carregar algo como /insecurepage.css e seu navegador irá solicitar yourdomain / insecurepage.css
antídoto
135

Nota: Embora essa solução possa ter funcionado em alguns navegadores quando foi escrita em 2014, ela não funciona mais. Navegar ou redirecionar para um URL HTTP em uma iframepágina HTTPS incorporada não é permitido por navegadores modernos, mesmo que o quadro tenha começado com um URL HTTPS.

A melhor solução que criei é simplesmente usar o google como proxy ssl ...

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

Testado e funciona no firefox.

Outros métodos:

  • Use um terceiro, como o embed.ly (mas é realmente bom apenas para APIs http conhecidas).

  • Crie seu próprio script de redirecionamento em uma página https que você controla (um redirecionamento javascript simples em uma página vinculada relativa deve fazer o truque. Algo como: (você pode usar qualquer idioma / método)

    https://example.com Que possui um iframe com link para ...

    https://example.com/utilities/redirect.html Que tem um script de redirecionamento js simples como ...

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

  • Como alternativa, você pode adicionar um feed RSS ou escrever um leitor / analisador para ler o site http e exibi-lo em seu site https.

  • Você também deve / deve recomendar ao proprietário do site http que ele crie uma conexão SSL. Se por nenhuma outra razão do que aumenta seo .

A menos que você consiga que o proprietário do site http crie um certificado SSL, a solução mais segura e permanente seria criar um feed RSS que captura o conteúdo que você precisa (presumivelmente você não está realmente 'fazendo' nada no site http - isto é, diga não fazer login em nenhum sistema).

O problema real é que ter elementos http em um site https representa um problema de segurança. Não há maneiras completamente kosher de contornar esse risco à segurança; portanto, as alternativas acima são apenas soluções atuais.

Observe que você pode desativar essa medida de segurança na maioria dos navegadores (você mesmo, não em outros). Observe também que esses 'hacks' podem se tornar obsoletos ao longo do tempo.

Matthew Peters
fonte
10
Ótima resposta, obrigado. Apenas para informar no chrome, o método de redirecionamento JS não funciona, apenas impede a alteração (como ocorre quando você tenta carregá-lo normalmente).
Georgephillips
9
O truque de redirecionamento parece funcionar apenas no Firefox. O Chrome ainda nega carregar o conteúdo não seguro. Existem outras soluções alternativas conhecidas?
precisa
47
Só queria sinalizar que o método "Crie seu próprio script de redirecionamento em uma página https que você controla" não funciona mais com as versões atuais do Chrom (e | ium) e Firefox, mesmo usando JS.
Kako-nawao
17
Esta resposta é inválida até o momento, quaisquer outras soluções
samdd 09/02
22
A resposta deve ter uma opção para ser rotulada como 'obsoleta'. Isso cria confusão, a menos que você leia todos os comentários.
Nitin
28

Eu sei que este é um post antigo, mas outra solução seria usar cURL, por exemplo:

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

na sua tag iframe, algo como:

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

Este é apenas um exemplo MINIMAL para ilustrar a idéia - não limpa a URL nem impede que outra pessoa use o redirect.php para seus próprios fins. Considere essas coisas no contexto do seu próprio site.

A vantagem, porém, é que é mais flexível. Por exemplo, você pode adicionar alguma validação dos dados $ ondulados para garantir que realmente seja o que deseja antes de exibi-los - por exemplo, teste para garantir que não seja um 404 e tenha seu próprio conteúdo alternativo pronto, se é.

Além disso - estou um pouco cansado de confiar nos redirecionamentos Javascript para qualquer coisa importante.

Felicidades!

David R.
fonte
4
Isso está funcionando, mas os links dentro do site estão ficando inválidos. Por exemplo, eu tenho um domínio chamado example.comque possui um SSL. Estou incorporando um iframe com o example.netqual não há SSL. O example.comtem um link como href="https://stackoverflow.com/path/file.html"e ao clicar nele, ele está abrindo como em https://example.com/path/file.htmlvez dehttp://example.net/path/file.html
Sibidharan
1
O link não pode ser relativo se você quiser que isso funcione. Em outras palavras, especifique o URL completo dentro do href. Se isso for dinâmico, existem bibliotecas para pegar cada segmento da URL em Javascript, bem como no lado do servidor.
Anthony Mason
css do site de destino em iframe está quebrado. Por favor, verifique
Raju yourPepe
14

adicione <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">na cabeça

referência: http://thehackernews.com/2015/04/disable-mixed-content-warning.html

compatibilidade do navegador: http://caniuse.com/#feat=upgradeinsecurerequests

user2523022
fonte
23
Esta solução não permite veicular conteúdo http em um site https. Tudo o que isso faz é forçar solicitações HTTP como solicitações https. Se o recurso não existir em https, você receberá um erro 404.
Felix
Isso realmente funciona, pelo menos, para as minhas necessidades .. testei com o firefox e confirmei o funcionamento. Meu problema é que o URL de origem não é compatível com HTTPS enquanto meu próprio site está usando HTTPS.
Fernan Vecina
Trabalhando como charme no chrome Versão 76.0.3809.132 (Compilação oficial)
Mohamed Azharuddin
8

Você sempre receberá avisos de conteúdo bloqueado na maioria dos navegadores ao tentar exibir conteúdo não seguro em uma página https. Isso é complicado se você deseja incorporar coisas de outros sites que não estão atrás do ssl. Você pode desativar os avisos ou remover o bloqueio no seu próprio navegador, mas para outros visitantes é um problema.

Uma maneira de fazer isso é carregar o lado do servidor de conteúdo, salvar as imagens e outras coisas no servidor e exibi-las em https.

Você também pode tentar usar um serviço como o embed.ly e obter o conteúdo através deles. Eles têm suporte para obter o conteúdo por trás de https.

Addeladde
fonte
se você raspa o conteúdo e o exibe no site, o risco é sempre o uso de scripts entre sites. Portanto, uma solução básica é raspar o conteúdo em um URL separado e apresentar os dados em um iframe desse URL com https. Dessa forma, você evita scripts entre sites no site principal e no seqüestro de sessões.
Addeladde
6

O uso do Google como proxy SSL não está funcionando atualmente,

Por quê?

Se você abriu qualquer página do google, encontrará um x-frame-optionscampo no cabeçalho. Cabeçalho de resposta do Google

O cabeçalho de resposta HTTP X-Frame-Options pode ser usado para indicar se um navegador deve ou não ter permissão para renderizar uma página em um <frame>, <iframe>ou <object>. Os sites podem usar isso para evitar ataques de clickjacking, garantindo que seu conteúdo não seja incorporado a outros sites.

(Citação da MDN)

Uma das soluções

Abaixo está o meu trabalho para esse problema:

Carregue o conteúdo no AWS S3 e ele criará um link https para o recurso.
Aviso: defina a permissão para o arquivo html para permitir que todos o vejam.

Depois disso, podemos usá-lo como o srciframe nos sites https. AWS

David Guan
fonte
2

Você pode tentar raspar o que precisar com PHP ou outra linguagem do servidor e colocar o iframe no conteúdo raspado. Aqui está um exemplo com o PHP:

scrapedcontent.php:

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

index.html:

<iframe src="scrapedcontent.php"></iframe>
Conceder
fonte
3
Como você lida com imagens, incluindo arquivos JS e CSS, hiperlinks e solicitações AJAX?
dotancohen
@dotancohen você está certo, não é uma solução perfeita, mas acho que é o melhor para esta situação. Em alguns sites, você não encontrará os problemas discutidos.
Grant
1
Isso funciona, mas a sua eficácia dupla de carregamento do conteúdo e de tempo, portanto, colocar como seus arranhões servidor e, em seguida, re-serve o conteúdo ...
ChristoKiwi
1

Use seu próprio proxy reverso HTTPS para HTTP.

Se o seu caso de uso for sobre alguns, raramente alterando URLs para incorporar ao iframe, você pode simplesmente configurar um proxy reverso para isso em seu próprio servidor e configurá-lo para que um httpsURL em seu servidor seja mapeado para umhttp URL no servidor proxy. Como um proxy reverso está totalmente do lado do servidor, o navegador não pode descobrir que está "apenas" conversando com um proxy do site real e, portanto, não irá reclamar, pois a conexão com o proxy usa o SSL corretamente.

Se, por exemplo, você usar o Apache2 como seu servidor da web, consulte estas instruções para criar um proxy reverso.

tanius
fonte
1
mitmproxyé uma ferramenta de depuração, não um sistema de proxy de produção. ngroké um serviço de encapsulamento, principalmente para servidores de desenvolvimento, não entendo como isso pode ser útil para isso.
Kolen
@kolen Não é sobre as ferramentas, é sobre a idéia de usar um proxy reverso para isso, ainda não mencionado nas outras respostas. Mudando para o Apache agora, que é uma maneira muito mais comum de fazer um proxy reverso.
maio