为什么IE8会错误地抱怨加载不安全元素?

7

我管理一个运行在SSL下的电子商务网站。

问题出现在我的网站购物车的最后一页,该页在SSL下加载。问题是Internet Explorer 8.0(包括版本8.0.6001.18702和其他版本的IE8,但据报道,并非所有版本的IE8)会抱怨至少一个非安全元素正在加载,这使得部分潜在客户望而却步。页面似乎已完全加载(看起来没有缺失的图像),但是页面加载完成后,IE8会弹出一个对话框:

"安全警告:您是否只想查看以安全方式交付的网页内容?此网页包含将不使用安全的HTTPS连接交付的内容,可能会损害整个网页的安全。(是/否)"

我尝试跟踪所有无效图像和链接,可能是通过HTTP加载的,但是没有结果。 Firebug Lite显示没有任何非安全内容。我开始认为这可能是IE8中的一个错误,该错误已在IE9中得到修正,因此IE9不会报错。

重现此错误:使用IE8(或Chrome)单击此处 添加物品到购物车。在结果页面上,单击右侧的绿色按钮“转到安全结账”。您会发现IE8弹出了上述“安全警告”。

问题:如何确定浏览器尝试非安全加载什么内容,或者如何抑制“警告”消息?

更新:似乎此页面上挂起了JavaScript执行,导致“安全警告”。但是同样的问题仍然存在。如何抑制或“调试”“安全警告”消息?


1
对于任何感兴趣的人,我正在与他合作。我们已经尝试使用Wireshark,并使用过滤器显示HTTP流量。Wireshark显示了单个HTTP事务,但我无法确定元素的路径。另外一个问题是:我该如何配置WireShark以显示HTTP元素的路径? - Ast Derek
只是提醒一下 -- Chrome 也会对该页面发出警告(不仅仅是IE8),但是我无法让Chrome显示到底访问了哪些未加密的数据。 - Soren
我刚刚用Chrome试了一下,没有出现任何错误。 - Jason
在Chrome中加载jQuery并运行以下代码段,它返回空:var list=[];$('[src]').each(function(){if($(this).attr('src').match('http:')){list.push(this)}});clear();console.log(list) - Ast Derek
值得一提的是,这个问题在我的IE 8.0.6001.18702中发生了。 在我的情况下,页面确实处于标准模式下,因此@Pumbaa80的建议似乎不起作用。 - sinelaw
显示剩余4条评论
6个回答

2
我知道这是一篇旧文章,但由于没有发布能解决我类似情况的答案,我想分享一下我发现的内容,以防其他人也会遇到这个问题。如果您使用removeChild()来删除包含内联样式设置背景图像的HTML元素,则在早期版本的IE8中会出现警告。您可以通过将设置背景图像的内联样式移动到在HTML头部或外部样式表中设置的样式类中来消除警告。
请参见此Microsoft KB页面,该页面表示该故障仅在IE6和IE7中发生,但我在XP上的IE8上也遇到了同样的问题,并且相同的修复方法起作用。

我也有这个警告... 警告仅在我从另一个窗口用 JavaScript 插入的 DOM 元素之前删除它们时发生。谢谢你的建议。 - Jean-Philippe Martin
这是我的修复代码:jQuery('[background]')。removeAttr('background'); 这个页面提供了一些背景信息:http://blog.httpwatch.com/2009/04/23/fixing-the-ie-8-warning-do-you-want-to-view-only-the-webpage-content-that-was-delivered-securely - Jean-Philippe Martin
看下面我的答案,实现这个修复的方法非常简单。 - Sorry-Im-a-N00b

2

如果用Wireshark调试标准的基于web浏览器的应用程序,它通常会提供太多不必要的信息,这样就不能准确地找到问题。在这种情况下,更好的解决方案是使用Fiddler,它是一个简单但非常强大的调试代理工具,除了许多有用的功能外,还能清楚地区分SSL和非SSL流量。

它还能模拟“中间人”测试环境,有效地允许它解密SSL流量。当然,为了防止滥用,所有浏览器都会明确标记生成的“即时”证书为不受信任。

编辑:我按照给定的说明来引发问题,但是在IE8中没有遇到任何安全警告问题。同时,Fiddler显示所有资源都通过SSL加载。


Holodoc,你使用的IE8版本是什么?针对你的发现,我已经编辑了原始帖子,注明了出现问题的IE8版本号。非常感谢。 - Empire Man
1
我使用Fiddler2进行了分析,我的IE(8.0.6001.18702)在跟踪像素(ping.chartbeat.net)上出现问题,尽管它似乎是https。 - user123444555621
Pumbaa,我以为你可能找到了答案,所以我注释掉了Chartbeat代码进行测试,但问题并没有消失。即使从页面中删除Chartbeat代码,我仍然看到“安全警告”消息。 - Empire Man
为了让您自己看到问题仍然存在,我现在已经注释掉了Chartbeat代码。如果您查看源代码并向下滚动到第526行,就可以看到它。 - Empire Man
嗯,对。我以为只有在我点击警告对话框之后才会发送请求。然而,这似乎与挂起的JS执行有关,而不是与某个特定的请求有关。 - user123444555621
Pumbaa,同意。但是,如果“安全警告”是由于JS执行被挂起,那么如何抑制或“调试”警告呢? - Empire Man

1

我曾经在IE8中遇到过类似的问题,看起来是缓存项的问题。我无法完全确定原因,因为像你一样,我检查了每个资源,没有发现任何未通过SSL加载的内容。然而,我注意到如果我阻止所有缓存并强制IE从服务器加载所有资源,则警告消失了。

我不知道是否存在某些从缓存中提取的项目不被识别为安全的错误,但它似乎与此有关。

禁用缓存显然是解决仅影响子集浏览器的问题的不良方法,但这可能是一个能够引导您朝正确方向的提示。


0

点击页面顶部的结账按钮?

现在不再是https了吗?


如果您指的是面包屑中的“结账”链接,那么您是正确的,但这似乎与原帖中描述的问题原因无关。 - Empire Man

0
如果您的网站有SSL支持的页面,那么所有的资源(js、css、图片)也应该通过HTTPS协议来提供服务。这是90%浏览器的相同行为。

3
我们已经知道这个问题的存在,但是我们无法确定页面上哪个元素导致了错误的出现。根据我们的测试,这个问题只会在IE8中出现。我将尽力保持翻译通俗易懂,同时不改变原意。 - Ast Derek

0

正如Jon所述:

如果您使用removeChild()来删除包含内联样式设置背景图像的HTML元素,则在旧版本的IE8中会出现警告。您可以通过将设置背景图像的内联样式移动到在HTML头部或外部样式表中设置的样式类中来摆脱警告。

虽然Microsoft KB Page提供了解决方法,但最好的解决方案是按照以下方式实施(放置在页面底部的脚本中):

Ext.removeNode = Ext.isIE ? function(){
    return function(n){
        if(n && n.tagName != 'BODY'){
            n.outerHTML = "";
        }
    }
}() : function(n){
    if(n && n.parentNode && n.tagName != 'BODY'){
        n.parentNode.removeChild(n);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接