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

时间:2013-08-20 05:04:17

标签: html security http iframe https

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

  

[已屏蔽] {current_pagename}的页面从{referenced_filename}

运行了不安全的内容

有没有什么方法可以关闭它或以任何方式绕过它?

iframe没有src属性,内容使用:

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

10 个答案:

答案 0 :(得分:125)

  

注意:虽然此解决方案在2014年编写时可能在某些浏览器中有效,但它不再有效。现代浏览器不允许导航或重定向到嵌入在HTTPS页面中的iframe中的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源或编写一些阅读器/解析器来阅读http站点并将其显示在您的https站点中。

  • 您可以/还应该向http网站所有者推荐他们创建ssl连接。如果没有其他原因而不是it increases seo

除非您可以让http网站所有者创建一个ssl证书,否则最安全和永久的解决方案是创建一个RSS源,用于绘制您需要的内容(可能是您实际上并没有在http网站上做任何事情 - 也就是说不登录任何系统)。

真正的问题是在https网站中使用http元素代表了安全问题。对于这种安全风险没有完全犹豫不决的方法,因此以上只是当前的解决方法。

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

答案 1 :(得分:25)

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

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

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

答案 2 :(得分:25)

我知道这是一篇旧帖子,但另一种解决方案是使用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>

这只是一个MINIMAL示例来说明这个想法 - 它不会对URL进行清理,也不会阻止其他人使用redirect.php来达到自己的目的。在您自己的网站上下文中考虑这些事情。

但好处是,它更灵活。例如,您可以添加curl&quot; d $数据的一些验证,以确保它在显示之前确实是您想要的 - 例如,测试以确保它不是404,并且如果有的话,请准备好自己的替代内容。

另外 - 我有点厌倦依赖Javascript重定向来处理任何重要内容。

干杯!

答案 3 :(得分:8)

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

答案 4 :(得分:7)

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

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

您还可以尝试使用embed.ly这样的服务并通过它们获取内容。他们支持将内容置于https之后。

答案 5 :(得分:5)

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

为什么?

如果您从谷歌打开任何页面,您会发现标题中有x-frame-options字段。 Google response header

  

X-Frame-Options HTTP响应标头可用于指示是否允许浏览器在<frame><iframe><object>中呈现页面。通过确保,站点可以使用它来避免点击劫持攻击   他们的内容没有嵌入其他网站。

(来自MDN的报价)

解决方案之一

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

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

之后,我们可以将其用作https网站中iframe的srcAWS

答案 6 :(得分:2)

您可以尝试使用PHP或其他服务器端语言抓取您需要的任何内容,然后将iframe放入已删除的内容中。这是PHP的一个例子:

scrapedcontent.php:

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

的index.html:

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

答案 7 :(得分:2)

您需要做的只是将Google用作代理服务器。

https://www.google.ie/gwt/x?u=[YourHttpLink]

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

对我有用。

积分:-https://www.wikihow.com/Use-Google-As-a-Proxy

答案 8 :(得分:1)

如果要将几个且很少更改的网址嵌入到iframe中,您可以在自己的服务器上为此设置一个SSL代理并对其进行配置,以便服务器上有一个https网址映射到代理服务器上的一个http URL。

例如,我会考虑ngrokmitmproxy,因为它们很小且配置简单(虽然通常用于略微不同的目的)。

答案 9 :(得分:0)

尝试使用协议相对链接

您的链接是http://example.com/script.js,请使用:

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

通过这种方式,您可以使方案保持空闲状态(不要在链接中指示协议),并可以信任浏览器使用嵌入式Web页面的协议。如果您的用户访问网页的HTTP版本,则脚本将通过http://加载;如果您的用户访问网站的HTTPS版本,则脚本将通过https://加载。

出现在:https://developer.mozilla.org/es/docs/Seguridad/MixedContent/arreglar_web_con_contenido_mixto