如何克服这个安全问题

Posted

技术标签:

【中文标题】如何克服这个安全问题【英文标题】:How to overcome this security issue 【发布时间】:2011-09-11 12:29:28 【问题描述】:

我已经实现了一个 ajax-polling 脚本,它每 10 秒在服务器控制器中调用一个动作。通过响应,我替换了 div 的内容:

function getFoo() 
    var link = '/Secure/GetFoo';

    $.post(link, function (response) 
        $('#FooSection').replaceWith(response);
    );

    setTimeout("getFoo();", 10000);

这是通过 https 完成的。在“空闲”一段时间后,IE 显示以下消息:

此页面正在访问信息 这不在它的控制之下。这 带来安全风险。你想要_____吗 继续?

如果用户点击Yes,页面将被重定向到div,仅显示响应。如果用户点击No,什么都不会发生,但div 容器不会被刷新。

我知道I can suppress this message through browser settings,但这只会根据上述对话框将我带到默认的选择。

asked before 也有类似的问题,但遗憾的是没有任何解决方案。我基本上想让我的 ajax 轮询即使在 secure 连接上也能正常工作。有什么想法吗?

【问题讨论】:

页面是否也使用 https 服务? @ZippyV,是的。 div 位于通过 https 提供服务的页面内。响应是一个有点动态的菜单,不断检查服务器是否有更新。 页面是否也通过 https 提供? (我只看到过与跨域请求有关的情况) @symcbean,他们来自同一个域,并且https。 使用 fiddler 你确定你的帖子是通过 HTTPS 完成的,我以为.ajax() 的简单方法只能通过 HTTP 发布和获取。 【参考方案1】:

您是否尝试过使用与协议相关的超链接 (//something.com/image.png)?请参阅this link 或this one。

【讨论】:

【参考方案2】:

您是否尝试过使用绝对网址?

var link = 'https://www.yourdomain.com/Secure/GetFoo';

【讨论】:

不,我没有。这会有帮助吗? 您应该确认“链接”请求是通过 https 发送的。如果它不是通过 https 发送的,那么尝试使用指定为“https”的绝对 url 可能会有所帮助。您可以使用 httpwatch 或 fiddler 验证请求是否通过 https 发送。你可以在这里下载 httpwatch - httpwatch.com/download 你可以在这里下载 fiddler - fiddler2.com/Fiddler2/version.asp【参考方案3】:

我以前见过这种情况,因为通过 ajax 调用插入的新内容链接到不安全的图像资产,这是否是您看到的问题?

【讨论】:

我收到的回复根本没有图像。只需ulatable。哦,还有一些 javascripts,基本上,一个没有非安全资产的视图页面看起来。 这些 javascript 是否有可能生成不安全的请求? 将不得不检查。但是当会话 expires 时,返回的视图中包含的 javascript 不会被调用。导致上述消息的罪魁祸首是 ajax-polling 脚本(在返回的视图之外)引起的,该脚本是网站主主页的一部分。【参考方案4】:

您永远不会在 Internet-Zone 页面上看到该对话框。默认情况下,此操作在 Internet 区域中被静默自动阻止。

该对话框出现在 Intranet 区域中有两个根本原因:

1> 尝试使用 XMLHTTPRequest 对象进行跨域请求 (http://blogs.msdn.com/b/ieinternals/archive/2011/04/22/ie-security-prompt-page-accessing-跨域信息-not-under-its-control.aspx)

2> 尝试将托管 html 的 OBJECT 标记导航到跨源页面。

您可以通过使用 XDomainRequest 而不是 XMLHTTPRequest 来避免第 1 种情况。 您可以通过使用 IFRAME 而不是 OBJECT 标记来避免第 2 种情况。

【讨论】:

所以我们必须想出两种解决方案,一种适用于除 IE 以外的所有浏览器,另一种适用于 IE。太好了。 我觉得你有点困惑;所有浏览器都执行同源策略。问题是您的代码在 JQuery 抽象下的实际行为方式。 相信我只在 IE8 上遇到过这个问题,但老实说我现在不记得了。感谢 Eric 的跟进。【参考方案5】:

前几天我遇到了类似的问题,无法找出为什么 IE 在 AJAX 请求后会抱怨。

我使用了 Firebug 的网络控制台,只是一个一个地处理请求,直到我找到一个 http:// 而不是 https://,我建议你也这样做 - 我们几乎不可能在没有看到页面的情况下调试它,但它可能只是没有通过 https 加载的背景图像。

注意: 我确实注意到你说它是 IE,但这样的问题可能不是特定于浏览器的,Firefox/Chrome 不会像 IE 那样对非 https 元素大惊小怪。

【讨论】:

@Mick Hansen,我实际上是在尝试在 FF4 上运行它,密切监视 Firebug 中的 Net 控制台。到目前为止,所有get 请求都在https 上,没有http。将再等几分钟让会话过期,然后看看情况如何。 @Alex 很奇怪,如果它在那里起作用真的应该是一些非 https 请求,并且如果你从一开始就打开它,它应该通过网络控制台显示 - 但是不要'不只是检查获取请求,检查所有请求:) @Mick,好的,大约一个小时后,我在同一个请求中收到了302。以前都是200……现在是FF。我想如果这是在 IE 中,那么我会收到我的问题中的消息。 @Alex 我不会想象 HTTP 响应代码有什么不同,只要它仍然是 HTTPS,很奇怪。虽然 302 是重定向,但重定向目标可能不是 HTTPS? 基于控制台,重定向尝试以处理身份验证的 ADFS 服务器为目标。它也是HTTPS。然而,可疑的是它属于 另一个 域,尽管可以在同一个 Intranet 中访问。 (我会确认一下。)我正在从 Azure 托管这个 Web 应用程序,如果这有任何帮助的话......但是,如果一切都失败了,重定向到另一个网站对我来说也是一个可行的解决方法。【参考方案6】:

如果您的代码中甚至有一个元素的 src 属性以“http”而不是“https”开头,IE 将显示该消息。

您确定要获取的数据中没有 src 属性中包含 src="http:// ..." 的元素吗?

【讨论】:

我验证了预期的响应,并且元素仅在其src 属性中没有对 http 的引用。仅供参考,我正在从控制器中检索ActionResult。返回的部分视图替换了我 https 页面中div #FooSection 的内容。 我认为您应该仔细检查一下,即使是 JQuery JS 文件也应该从 https 提供,否则您会收到该消息。【参考方案7】:

您的代码有两点:

为什么要使用 POST ajax 请求?为什么不 GET ? 您的请求看起来像 GET 请求(您想获取一些数据),因此 GET 方法可能是更好的选择。

这与您的问题无关,但您不应使用带有字符串的 setTimeout 进行评估。你应该给 setTimeout 一个变量作为第一个参数,这个变量应该是你要执行的函数。

function getFoo() 
    var link = '/Secure/GetFoo';

    $.get(link, function (response) 
        $('#FooSection').replaceWith(response);
    );

    window.setTimeout(getFoo, 10000);

【讨论】:

可能他正在使用 POST 来避免缓存。

以上是关于如何克服这个安全问题的主要内容,如果未能解决你的问题,请参考以下文章

超融合如何克服云桌面启动风暴--云宏

克服云安全挑战的5种方法

超融合如何克服启动风暴?云桌面启动风暴的解决办法

异步期间的线程安全问题,如何解决这个问题

克服 CosmosDB 20GB 逻辑分区大小

如何避免这个javaservlet登录页面安全问题