如何在https网站上的iframe中允许http内容

我将一些HTML加载到iframe中,但是当引用的文件使用http而不是https时,出现以下错误:

[blocked] {current_pagename}中的页面从{referenced_filename}中运行不安全的内容

有什么办法可以关掉它或以任何方式解决它?

iframe没有src属性,内容使用如下设置:

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

基于这个问题的一般性,我认为,你需要在一些在线服务器上设置自己的HTTPS代理。 执行以下步骤:

  • 准备好您的代理服务器 – 安装IIS,Apache
  • 获得有效的SSL证书以避免安全错误(例如,免费从startssl.com)
  • 写一个包装,它将下载不安全的内容(如何下面)
  • 从您的网站/应用程序获取https://yourproxy.com/?page=http://insecurepage.com

如果您只是通过file_get_contents或类似的方式下载远程站点内容,则仍可能存在不安全的内容链接。 你将不得不用正则expression式来find它们,并且replace它。 图像很难解决,但Ïfind解决办法在这里: http : //foundationphp.com/tutorials/image_proxy.php

我创build的最佳解决scheme是简单地使用谷歌作为SSL代理…

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

经过testing,并在Firefox中工作。

其他方法:

  • 使用第三方,比如embed.ly(但它确实只适用于众所周知的http API)。

  • 在你控制的https页面上创build你自己的redirect脚本(一个简单的JavaScriptredirect到一个相对链接的页面上就可以实现,就像:(你可以使用任何语言/方法)

    https://mysite.com有一个iframe链接到…

    https://mysite.com/utilities/redirect.html其中有一个简单的JSredirect脚本,如…

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

  • 或者,你可以添加一个RSS提要或者写一些阅读器/parsing器来阅读http站点并将其显示在你的https站点中。

  • 您可以/也应该build议http网站所有者创build一个ssl连接。 如果没有其他原因, 它会增加SEO 。

除非你可以让http站点所有者创build一个ssl证书,否则最安全永久的解决scheme就是创build一个RSS feed来抓取你需要的内容(假设你实际上并没有在http站点上“做”任何事情,那就是说不login到任何系统)。

真正的问题是,在https站点中使用http元素代表安全问题。 这种安全风险并没有完全可靠的方法,所以以上只是目前的解决方法。

请注意,您可以在大多数浏览器(您自己,而不是其他人)中禁用此安全措施。 另外请注意,随着时间的推移,这些“黑客”可能会过时。

我知道这是一个旧的post,但另一个解决scheme是使用cURL,例如:

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

然后在你的iframe标签,如:

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

这只是一个最小的例子来说明这个想法 – 它不会净化URL,也不会阻止别人使用redirect.php来达到自己的目的。 在你自己的网站的背景下考虑这些事情。

不过,好处是更加灵活。 例如,您可以添加curl'd $ data的一些validation,以确保它在显示之前确实是您想要的 – 例如,testing以确保它不是404,并且有自己准备好的备用内容是。

另外 – 我有点厌倦了依靠Javascriptredirect的重要事情。

干杯!

尝试在https页面上显示不安全的内容时,您将始终在大多数浏览器中收到被阻止内容的警告。 这是棘手的,如果你想embedded其他网站不落后ssl的东西。 您可以closures警告或在自己的浏览器中删除阻止,但对其他访问者来说,这是一个问题。

一种方法是加载内容服务器端并将图像和其他内容保存到服务器,并通过https显示。

您也可以尝试使用像embed.ly这样的服务,并通过它们获取内容。 他们支持获取https后面的内容。

使用Google作为SSL代理目前无法正常工作,

为什么?

如果您从Google打开任何页面,您会发现标题中有一个x-frame-options字段。 Google回应标题

X-Frame-Options HTTP响应头可用于指示是否允许浏览器在a,b或c中呈现页面。 网站可以通过确保他们的内容没有embedded到其他网站来使用它来避免点击劫持攻击。

(来自MDN的报价)

其中一个解决scheme

下面是我的解决这个问题的方法:

将内容上传到AWS S3,它将为该资源创build一个https链接。
注意:将权限设置为允许所有人查看它的html文件。

之后,我们可以使用它作为https网站中的iframe的srcAWS

在头部添加<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">

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

浏览器兼容性: http : //caniuse.com/#feat=upgradeinsecurerequests

如果只有less数几个很less更改的URLembedded到iframe ,则可以在您自己的服务器上为此设置SSL代理,并对其进行configuration,以便服务器上的一个https URL映射到代理上的一个http URL。

例如,我会研究ngrok和mitmproxy ,因为它们很小并且configuration简单(尽pipe通常意味着略有不同的目的)。

你可以尝试使用PHP或其他服务器端语言来抓取任何你需要的东西,然后把iframe放到抓取的内容中。 这里是一个PHP的例子:

scrapedcontent.php:

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

index.html的:

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