问题描述
我将一些 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。