【问题标题】:Can "Show Insecure Content" Browser Prompt Be Detected?可以检测到“显示不安全内容”浏览器提示吗?
【发布时间】:2012-08-25 14:02:14
【问题描述】:

我们都熟悉页面上混合方案(http / https)内容的问题。

我正在开发一个不可避免的网站。我不想阻止这种情况。我知道这方面有很多问题/答案。

我需要的只是检测(通过 JavaScript?),这样我就可以调整页面行为(显示降级行为的通知或其他内容)。有什么帮助吗?

【问题讨论】:

  • 我不明白?您正在提供一个包含混合内容但不知道的页面?您怎么会不知道该页面是否包含不安全的内容?您不是提供页面的网站吗?
  • 嘿布拉德!我正在提供一个包含可变内容的 iframe 的页面。所以<iframe src="SOME_RANDOM_WEBSITE" />。我不控制SOME_RANDOM_WEBSITE 的值,它可以是http。这很好,但我想确保用户知道他们缺少 iframe 中的内容,直到按下“显示所有内容”。有意义吗?
  • 所以你说你想在本机安全警报中附加一些信息,说“这就是你所缺少的”?不是字面附加,而是通过 js alert 等方式附加。
  • 嗨,金鹦鹉。不,不完全是。只是页面中的另一个元素说“请允许不安全的内容充分使用此页面”。
  • 请记住,“显示所有内容”选项在某些当前或未来的浏览器中可能不存在。例如,一些移动浏览器可能没有这样的选项,Chrome 正在朝着移除它的方向前进。

标签: javascript security ssl web


【解决方案1】:

使用 jQuery,您可以使用以下代码找出页面上是否存在任何不安全的项目:

var flag = false;
if($("script[src^='http:']").length > 0
    || $("link[type='text/css'][href^='http:']").length > 0
    || $("img[src^='http:']").length > 0
    || $("iframe[src^=http:]").length > 0)
    flag = true; // insecure content :(
else
    // yay!

图片、JS、CSS 都是我能想到的不安全内容。也许还有更多,但您可以轻松地将它们添加到您找到的位置。

【讨论】:

  • 酷,谢谢。我绝对可以知道内容不安全。我想知道的是两件事。 1. 浏览器是否显示此提示(在我的情况下只有 IE) 2. 用户是否单击它或它仍在显示。所以我可以显示一个警报,在 IFRAME 附近的屏幕上添加一些注释等。
  • 这不是一个坏方法,但捕获动态内容可能会很棘手:XHR 请求或稍后异步加载的内容。
【解决方案2】:

这很 hacky,但我设法在所有浏览器中仅使用 JavaScript 解决了这个问题。让我看看我能不能把它画出来。

我们有这个基本的加密页面:

<html> 
   <body>
        <div> stuff </div>
        <iframe src="URL_WHICH_IS_MAYBE_INSECURE"></iframe>
   </body>
</html>

URL_WHICH_IS_MAYBE_INSECURE 是 https 时,一切都很好。但是当URL_WHICH_IS_MAYBE_INSECURE 为http 时,IE 将加载内容,除非用户OK 的不安全/混合内容。我想告诉用户该页面有点被破坏,直到他们点击允许。由于我无法进入的原因,我知道所有网站都是值得信赖的。只是其中一些不支持 SSL,而父站点需要。

AFAIK,我无法使用 JS 检测到此对话框/半加载状态。但是我能做的是在不安全的连接上运行 JS,如果他们允许的话(这也使 iframe 运行)。所以URL_WHICH_IS_MAYBE_INSECURE 是http 并且网站是https(混合)我添加两位代码+ HTML。

<html> 
   <body>
        <div> stuff </div>
        @if(needSpecialHandlingForMixedMode) {
            <div id="secureWarn">
                 WARNING: This page has limited functionality, allow mixed content
             </div>
        }
        <iframe src="URL_WHICH_IS_MAYBE_INSECURE"></iframe>
   </body>

   @if (needSpecialHandlingForMixedMode)
   {
      string baseUrl = Request.Url.SchemeAndHostAndPort().Replace("https", "http");
      <script src="@baseUrl/scripts/security-warning.js"></script>
   }
</html>

脚本是

$(document).ready(function(e) {
    $("#secureWarn").remove();
});

所以它是这样工作的。

  1. 如果是混合模式,则 iframe 和脚本只有在用户允许的情况下才会加载。这在 IE 中默认是不允许的,而在 Chrome 和 FireFox 中默认是允许的。
  2. 如果他们什么都不做(例如在 IE 中不允许),它将保持警告 div 可见。
  3. 如果他们确实单击它,iframe 会加载,现在脚本也会运行(因为它不安全地返回到我的服务器),这会从页面中删除警告。
  4. 幸福开始...

希望这对某人有所帮助。

干杯, 迈克尔

【讨论】:

  • 这个问题是它会尝试加载一些可能不安全的内容:这应该在所有情况下触发浏览器警告(除非用户禁用它们)。这通常是一个坏主意。 “我想告诉用户,在他们点击允许之前,该页面已被破坏。由于我无法进入的原因,我知道所有网站都是值得信赖的。”:不幸的是,您的推理在这里有缺陷:您无法知道您的用户与其他内容提供商之间是否存在 MITM。鼓励用户点击允许绝不是一个好主意,因为您无法控制他们的网络。
  • 嗨布鲁诺。我确实听到了您所说的鼓励用户跳过安全提示的内容。但是你错过了“这应该在所有情况下触发浏览器警告”这一点,这根本不是真的。只有当底层内容也是 HTTP over HTTPS 时,它才会通过 HTTPS 添加 HTTP 脚本。当内容是 HTTPS 时,什么都没有添加,一切都很好。干杯,迈克尔。
猜你喜欢
  • 2012-09-23
  • 1970-01-01
  • 2015-06-16
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 2017-02-07
相关资源
最近更新 更多