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

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

[阻塞]{ current _ pagename }上的页面运行了{ reference _ filename }上不安全的内容

有什么办法能把这个关掉或者绕过去吗?

Iframe 没有 src属性,内容使用以下方式设置:

frame.open();
frame.write(html);
frame.close();
463925 次浏览

在大多数浏览器中,当您试图在 https 页面上显示不安全的内容时,总是会收到阻塞内容的警告。如果您想要嵌入不在 ssl 后面的其他站点的内容,那么这个问题就比较棘手。你可以在自己的浏览器中关闭警告或移除阻塞,但对其他访问者来说,这是个问题。

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

您还可以尝试使用一个服务,比如 embed.ly,并通过它们获取内容。他们支持获取 https 背后的内容。

您可以尝试使用 PHP 或其他服务器端语言来刮取任何需要的内容,然后将 iframe 放到刮取的内容中。下面是 PHP 的一个例子:

Scrapedcontent.php:

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

.html:

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

注意: 虽然这个解决方案在2014年编写的时候可能在某些浏览器中有效,但是现在已经不再有效了。现代浏览器不允许在嵌入 HTTPS 页面的 iframe中导航或重定向到 HTTP URL,即使框架以 HTTPS URL 开始。

我创建的最佳解决方案是简单地使用谷歌作为 ssl 代理..。

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

在 Firefox 中测试和工作。

其他方法:

  • 使用一个第三方,比如嵌入式.ly (但它只适用于众所周知的 http API)。

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

    这个 iframe 连接到..。

    它有一个简单的 js 重定向脚本,如..。

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

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

  • 您还可以/应该建议 http 站点所有者创建一个 ssl 连接。如果没有其他原因,除了 会增加搜索引擎优化

除非你能让 http 站点的所有者创建一个 ssl 证书,否则最安全和永久的解决方案就是创建一个抓取你所需内容的 RSS 提要(假设你实际上并没有在 http 站点上“做”任何事情——也就是说不登录任何系统)。

真正的问题是,在 https 站点中包含 http 元素代表了一个安全问题。对于这种安全风险,没有完全符合犹太教规的方法,所以以上只是目前的解决办法。

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

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

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

如果您只是通过 file _ get _ content 或类似的方式下载远程站点内容,那么您仍然可能有指向内容的不安全链接。您必须使用正则表达式找到它们,并替换它们。图像很难解决,但在这里找到了解决办法: http://foundationphp.com/tutorials/image_proxy.php

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

如果您的用例只有几个,很少改变 URL 以嵌入到 iframe中,您可以简单地在您自己的服务器上为此设置一个反向代理,并配置它,以便您服务器上的一个 https URL 映射到代理服务器上的一个 http URL。由于反向代理是完全服务器端的,浏览器不能发现它“只”与真实网站的代理进行通信,因此不会抱怨,因为到代理的连接正确地使用了 SSL。

例如,如果您使用 Apache2作为您的 webserver,那么请参见 这些指示来创建一个反向代理。

我知道这是一篇老文章,但另一个解决方案是使用 cURL,例如:

返回文章页面

<?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 的验证,以确保在显示它之前它是您真正想要的——例如,测试以确保它不是404,并且如果它是,则拥有您自己的备用内容。

另外,我有点厌倦了依赖 Javascript 重定向做任何重要的事情。

干杯!

在头部加入 <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

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

为什么?

如果你打开任何网页从谷歌,你会发现有一个 x-frame-options字段在标题。 Google response header

X-Frame-Options HTTP 响应头可用于指示是否允许浏览器在 <frame><iframe><object>中呈现页面。网站可以利用这一点来避免点击劫持攻击,方法是确保 他们的内容不会嵌入到其他网站。

(引自 MDN)

解决办法之一

下面是我围绕这个问题所做的工作:

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

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

你所需要做的就是使用谷歌作为代理服务器。

Https://www.google.ie/gwt/x?u= [ youttpLink ] .

<iframe src="https://www.google.ie/gwt/x?u=[Your http link]"></iframe>

这招对我很管用。

来源:-https://www.wikihow.com/Use-Google-As-a-Proxy

尝试使用 协议相对链路协议相对链路

你的连结是 http://example.com/script.js,使用:

<script src="//example.com/script.js" type="text/javascript"></script>

通过这种方式,您可以保留该方案的自由(不要在链接中指明协议) ,并相信浏览器使用嵌入式 Web 页面的协议。如果您的用户访问您的 Web 页面的 HTTP 版本,脚本将通过 HTTP://加载,如果您的用户访问您的 Web 站点的 HTTPS 版本,脚本将通过 HTTPS://加载。

见于: https://developer.mozilla.org/es/docs/Seguridad/MixedContent/arreglar_web_con_contenido_mixto