问题描述

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

[blocked] The page at {current_pagename} ran insecure content from {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 或类似的方式下载远程站点内容,您仍然可以向内容发送不安全的链接。你必须用正则表达式找到它们,并且替换它们。图像很难解决,但是在这里找到解决办法:http://foundationphp.com/tutorials/image_proxy.php

次佳解决方案

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

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

测试和工作在 firefox 。

其他方法:

  • 使用第三方,如 embed.ly(但它真的只对知名的 http API 有好处) 。

  • 在您控制的 https 页面上创建自己的重定向脚本 (相对链接页面上的一个简单的 JavaScript 重定向应该做到这一点):(可以使用任何 langauge /方法)https://mysite.com 有一个 iframe 链接到… https://mysite.com/utilities/redirect.html 哪个有一个简单的 js 重定向脚本,如… document.location.href ="http://thenonsslsite.com";

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

  • 您可以/也应该向 http 站点所有者推荐他们创建一个 ssl 连接。如果没有其他原因比 it increases seo

除非您可以让 http 站点所有者创建一个 ssl 证书,否则最安全和永久的解决方案是创建一个 RSS feed 来获取所需的内容 (可能你实际上并不是’doing’ 在 http 站点上的任何东西 – 也就是说不是登录到任何系统) 。

真正的问题是在 https 站点中拥有 http 元素是一个安全问题。这个安全风险并不是完全犹豫的,所以以上只是目前的工作。

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

第三种解决方案

我知道这是一个老帖子,但另一个解决方案是使用 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 $数据的一些验证,以确保它在显示之前确实是您想要的 – 例如,测试以确保它不是 404,并且具有自己准备的备用内容是。

另外 – 我有点厌倦依靠 Javascript 重定向任何重要的东西。

干杯!

第四种方案

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

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

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

第五种方案

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

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

browser compatibility: http://caniuse.com/#feat=upgradeinsecurerequests

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛