关于html:如何在https站点的iframe中允许http内容

How to allow http content within an iframe on a https site

本问题已经有最佳答案,请猛点这里访问。

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

[blocked] The page at {current_pagename} ran insecure content from {referenced_filename}

是否有任何方法可以关闭此功能或解决该问题?

iframe没有src属性,并且使用以下内容设置内容:

1
2
3
frame.open();
frame.write(html);
frame.close();


Note: While this solution may have worked in some browsers when it was written in 2014, it no longer works. Navigating or redirecting to an HTTP URL in an iframe embedded in an HTTPS page is not permitted by modern browsers, even if the frame started out with an HTTPS URL.

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

1
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元素表示安全问题。尚没有完全解决这种安全风险的方法,因此上述内容只是当前的解决方法。

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


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

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

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


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

redirect.php:

1
2
3
4
5
6
7
8
9
10
11
12
<?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代码中,如下所示:

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

这只是一个说明这个想法的最小示例-它不会清理URL,也不会阻止其他人出于自己的目的使用redirect.php。在您自己的站点的上下文中考虑这些事情。

好处是,它更灵活。例如,您可以添加一些对curl \\'d $ data的验证,以确保它确实是您想要的,然后再显示它-例如,测试以确保它不是404,并使用您自己准备好的内容。

加-我对依靠Java重定向进行重要的操作有点厌倦了。

干杯!


在头部

中添加<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


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

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

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


使用Google作为SSL代理当前不起作用,

为什么?

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

The X-Frame-Options HTTP response header can be used to indicate whether or not a browser should be allowed to render a page in a ,