問題描述

我將一些 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇