web-dev-qa-db-pt.com

Como permitir o acesso http em um iframe em um site https

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

[blocked] A página em {current_pagename} exibiu conteúdo inseguro de {referenced_filename}

Existe alguma maneira de desligar isso ou de qualquer maneira para contornar isso?

O iframe não possui o atributo src e o conteúdo é definido usando:

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

Com base na generalidade desta questão, acho que você precisará configurar seu próprio proxy HTTPS em algum servidor on-line. Siga os seguintes passos:

  • Prepare o seu servidor proxy - instale o IIS, Apache
  • Obtenha um certificado SSL válido para evitar erros de segurança (livre de startssl.com, por exemplo)
  • Escreva um wrapper, que baixará o conteúdo inseguro (como abaixo)
  • Do seu site/aplicativo get https://yourproxy.com/?page=http://insecurepage.com

Se você simplesmente baixar o conteúdo do site remoto via file_get_contents ou similar, ainda poderá ter links inseguros para o conteúdo. Você terá que encontrá-los com regex e também substituir. Imagens são difíceis de resolver, mas Ï encontrou solução aqui: http://foundationphp.com/tutorials/image_proxy.php

25
panpernicek

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

A melhor solução que criei é simplesmente usar o google como o 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 conhecidas).

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

    https://example.com Que tem um iframe vinculado a ...

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

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

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

  • Você também pode/deve recomendar ao proprietário do site http que ele crie uma conexão ssl. Se por nenhum outro motivo 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 capture o conteúdo que você precisa (presumivelmente, você não está realmente 'fazendo' nada no site http - que é diga não entrar em qualquer sistema).

A questão real é que ter elementos http dentro de um site https representa um problema de segurança. Não há maneiras completamente kosher em torno deste risco de segurança, de modo que o acima é apenas um trabalho atual.

Note que você pode desabilitar esta medida de segurança na maioria dos navegadores (você mesmo, não para outros). Observe também que esses "hacks" podem se tornar obsoletos com o tempo.

126
Matthew Peters

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

então na sua tag iframe, algo como:

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

Este é apenas um exemplo MÍNIMO para ilustrar a ideia - ela não desinfecta a URL, nem impede que outra pessoa use o redirect.php para seus próprios propósitos. Considere estas coisas no contexto do seu próprio site.

A vantagem, porém, é que é mais flexível. Por exemplo, você poderia adicionar alguma validação do curl $ data para ter certeza de que é realmente o que você quer antes de exibi-lo - por exemplo, testar para ter certeza de que não é um 404 e ter um conteúdo alternativo pronto se é.

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

Felicidades!

25
David R.

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

9
user2523022

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ê quiser incorporar coisas de outros sites que não estão atrás do ssl. Você pode desativar os avisos ou remover o bloqueio em seu próprio navegador, mas para outros visitantes é um problema.

Uma maneira de fazer isso é carregar o lado do servidor de conteúdo e salvar as imagens e outras coisas em seu servidor e exibi-las a partir de 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 do https.

7
Addeladde

Usando o Google como o proxy SSL não está funcionando atualmente,

Por quê?

Se você abriu qualquer página do google, verá que há um campo x-frame-options no cabeçalho. Google response header

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 <frame>, <iframe> ou <object>. Os sites podem usar isso para evitar ataques de clickjacking, garantindo que o conteúdo deles não seja incorporado a outros sites.

(Citação do MDN)

Uma das soluções

Abaixo está o meu trabalho para este 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 src do iframe nos sites https. AWS

5
David Guan

Você pode tentar copiar o que precisar com PHP ou outro idioma do lado do servidor e, em seguida, colocar o iframe no conteúdo copiado. Aqui está um exemplo com PHP:

scrapedcontent.php:

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

index.html:

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

Se é sobre alguns e raramente mudando URLs para incorporar no iframe, você poderia configurar um proxy SSL para isso em seu próprio servidor e configurá-lo para que uma URL https em seu servidor seja mapeada para uma URL http no servidor proxy.

Por exemplo, eu olharia para ngrok e mitmproxy para isso, uma vez que eles são pequenos e simples de configurar (embora usualmente significados para propósitos ligeiramente diferentes).

1
tanius