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


145

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

[已屏蔽] {current_pagename}中的页面运行了来自{referenced_filename}的不安全内容

有什么办法可以关闭它或解决它吗?

iframe没有src属性,其内容使用以下方法设置:

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


进行了编辑。未设置src,因为内容已写入iframe
georgephillips

1
感谢所有的答案。长话短说是代理的内容。
georgephillips

@georgephillips您将共享用于代理内容的代码吗?
Gintas_

Answers:


28

基于此问题的普遍性,我认为您需要在某些在线服务器上设置自己的HTTPS代理。请执行以下步骤:

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

如果仅通过file_get_contents或类似文件下载远程站点内容,您仍然可以使用不安全的内容链接。您必须使用正则表达式找到它们并替换它们。图片很难解析,但是在这里找到了解决方法:http : //foundationphp.com/tutorials/image_proxy.php


1
这将不起作用,因为iframe后面的许多页面都不想被嵌入iframe中,因此将X-Frame-Options标头设置为SAMEORIGIN。即使您能够使用代理绕过此操作,页面也会尝试加载/insecurepage.css之类的内容,并且您的浏览器将请求yourdomain / insecurepage.css
解毒剂

135

注意:虽然该解决方案在2014年编写时可能已在某些浏览器中运行,但不再起作用。iframe现代浏览器不允许导航或重定向到嵌入HTTPS页面中的HTTP URL ,即使框架以HTTPS URL开始也是如此。

我创建的最好的解决方案是简单地使用google作为ssl代理...

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

经过测试并在Firefox中工作。

其他方法:

  • 使用诸如embed.ly之类的第三方(但这实际上仅对众所周知的http API有用)。

  • 在您控制的https页面上创建自己的重定向脚本(在相对链接的页面上执行简单的javascript重定向就可以解决问题。例如:(您可以使用任何语言/方法)

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

    https://example.com/utilities/redirect.html 其中有一个简单的js重定向脚本,例如...

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

  • 或者,您可以添加RSS feed或编写一些阅读器/解析器以读取http站点并将其显示在https站点中。

  • 您还可以/应该向http站点所有者推荐他们创建ssl连接。如果没有其他原因,它会增加seo

除非您可以让http网站所有者创建ssl证书,否则最安全和永久的解决方案是创建一个RSS feed,以获取所需的内容(假设您实际上并没有在http网站上“做任何事情”,即说不登录任何系统)。

真正的问题是,在https站点内包含http元素表示安全问题。没有完全消除这种安全风险的方法,因此上述内容只是当前的解决方法。

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


10
好答案,谢谢。只是为了让您知道chrome的JS重定向方法不起作用,只是阻止了更改(就像您尝试正常加载时所做的那样)。
georgephillips 2014年

9
重定向技巧似乎仅在Firefox中有效。Chrome仍然拒绝加载不安全的内容。还有其他已知的解决方法吗?
Andreas Gohr 2014年

47
只是想表明“在您控制的https页面上创建自己的重定向脚本”方法不再适用于Chrom(e | ium)和Firefox的当前版本,即使使用JS也是如此。
kako-nawao 2015年

17
迄今为止,这个答案是无效的,任何其他解决方案
samdd

22
答案应该有一个选项被标记为“已弃用”。除非您阅读所有评论,否则它会造成混乱。
Nitin

28

我知道这是一篇旧文章,但另一个解决方案是使用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的$ data添加一些验证,以确保它确实是您想要的,然后再显示它-例如,进行测试以确保它不是404,并准备好自己的替代内容是。

另外-对于有些重要的事情,我有点依赖Javascript重定向。

干杯!


4
这很不错,但是网站内部的链接无效。例如,我有一个名为example.comSSL 的域。我正在嵌入example.net没有SSL 的iframe 。在example.com具有像一个链接href="https://stackoverflow.com/path/file.html",并同时点击它,它是开放的https://example.com/path/file.html,而不是http://example.net/path/file.html
Sibidharan

1
如果您希望此链接有效,则该链接不能是相对的。换句话说,在href中指定完整的URL。如果这是动态的,则可以使用库来捕获Javascript和服务器端URL的每个部分。
安东尼·梅森

iframe下目标站点的css已损坏。请检查
Raju yourPepe '19

14

<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


23
此解决方案不允许您在https站点上提供http内容。这一切都是将http请求强制为https请求。如果https上不存在该资源,则只会显示404错误。
Felix

这实际上至少可以满足我的需求。.用firefox测试并确认可以正常工作。我的问题是,当我自己的网站使用HTTPS时,源URL不符合HTTPS。
Fernan Vecina

在Chrome版本76.0.3809.132(正式版本)中像魅力一样工作
Mohamed Azharuddin

8

当您尝试在https页面上显示不安全的内容时,在大多数浏览器中,您始终会收到警告,提示内容被阻止。如果您要嵌入其他未位于ssl后面的站点中的内容,这将非常棘手。您可以在您自己的浏览器中关闭警告或删除阻止,但是对于其他访问者来说,这是一个问题。

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

您也可以尝试使用embed.ly之类的服务,并通过它们获取内容。他们支持将内容隐藏在https之后。


如果您将内容抓取并显示在您的网站上,则始终有跨站点脚本编写的风险。因此,一种可行的解决方案是将内容抓取到单独的网址上,并使用https从该网址的iframe中呈现数据。这样,您可以防止在主站点上进行跨站点脚本编写和会话劫持。
阿德莱德2014年

6

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

为什么?

如果您打开了Google的任何页面,就会x-frame-options在标题中找到一个字段。 Google回应标题

X框,选择HTTP响应头可用于指示浏览器是否应该被允许在渲染页面<frame><iframe><object>。网站可以通过确保其内容未嵌入其他网站来避免点击劫持攻击。

(MDN的报价)

解决方案之一

以下是我针对此问题的解决方法:

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

之后,我们可以将其用作srchttps网站中的iframe。 AWS


2

您可以尝试使用PHP或其他服务器端语言来刮取所需的任何内容,然后将iframe放入被刮取的内容。这是PHP的示例:

scrapedcontent.php:

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

index.html:

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

3
您将如何处理图像,包含的JS和CSS文件,超链接和AJAX请求?
dotancohen 2014年

@dotancohen你是对的,这不是一个完美的解决方案,但我认为这是最适合这种情况的方法。您不会碰到某些网站的问题。
2014年

1
这行得通,但实际上有效地加倍了内容的加载,因此在服务器
抓取


1

使用您自己的HTTPS到HTTP反向代理。

如果您的用例大约是几个,很少会更改要嵌入的URL iframe,则可以在自己的服务器上简单地为此设置反向代理并对其进行配置,以使https服务器上的一个httpURL 映射到代理服务器上的一个URL。由于反向代理完全在服务器端,因此浏览器无法发现它只是在与真实网站的代理进行对话,因此不会抱怨,因为与代理的连接正确使用了SSL。

例如,如果您使用Apache2作为Web服务器,则请参阅以下说明以创建反向代理。


1
mitmproxy是调试工具,而不是生产代理系统。ngrok是隧道服务,主要用于开发服务器,我不知道它对此有何用处。
kolen

@kolen不是关于工具,而是关于使用反向代理的想法,其他答案中没有提到。现在更改为Apache,这是执行反向代理的一种更为常见的方法。
tanius
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.