JavaScript 跨域调用:从 HTTP 调用到 HTTPS

Posted

技术标签:

【中文标题】JavaScript 跨域调用:从 HTTP 调用到 HTTPS【英文标题】:JavaScript cross-domain call: call from HTTP to HTTPS 【发布时间】:2012-01-14 22:23:36 【问题描述】:

我需要对同一域的安全 (HTTPS) URL 进行异步调用。

目前该页面使用常规 HTTP(非安全)。

换句话说:这是调用同一域中的 URL,但使用 HTTPS。

在将此调用切换到 HTTPS 之前,我结束了实现服务器端代理以允许跨域 AJAX 调用,但现在我面临相同的来源策略,因为 HTTP 和 HTTPS 也被认为是不同的来源。所以这个代理是不可用的。

总结:这种场景下如何做跨域、异步的POST请求?

各种注释:

我不能接受任何建议 JSONP 的答案。异步调用必须使用 POST 动词。 我正在使用最新版本的 jQuery。答案可能基于此库,或任何其他解决此问题的方法。 通过 HTTPS 访问整个页面不是解决方案。 服务器平台是 Microsoft .NET 4.0 (ASP.NET 4.0)。 UDPATE:CORS 不是一个选项。现代浏览器对此没有广泛的支持。

【问题讨论】:

没有解决方案可以满足您的所有要求(如果在任何浏览器中存在,则根据跨域策略,这是一个安全漏洞)。 @gsnedders 好吧,我正在寻找解决方法,你说得对。 【参考方案1】:

有人看过吗:

https://github.com/jpillora/xdomain

它使用postMessage和iframes来实现cors请求,并且是跨浏览器的(在IE中不需要咬牙切齿的XDomainRequests)。

也许它会允许跨协议 cors 请求?

【讨论】:

但是现在所有主要的 Web 浏览器都支持 CORS,甚至在移动版本中,我错了吗? :D 我们的项目要求我们可以使用 IE 8 和 9,这意味着我们会进行痛苦的浏览器检测和 XDomainRequests - 但即使经过整理,IE 仍然拒绝混合协议 cors。我还没有测试,但我希望这个库能让我们简化/统一我们的 Ajax js 并允许它们跨协议! 你对现代 IE 的限制是正确的......好吧,在你的情况下,这个库似乎应该解决问题! 很好,会试一试 - 但是有人对这个库的工作方式有任何安全问题吗?【参考方案2】:

首先,我已经为@missingo 和@PiTheNumber 的两个问题+1。

花了很多时间后,我得出的结论是,我要将整个页面切换到 HTTPS。那是因为:

大多数现代浏览器都支持 CORS,但 Internet Explorer 从第 8 版开始有一个专有的实现(XDomainRequest 对象),它可能在某些计算机中被禁用(我在 Internet 安全区域中默认禁用了跨域请求)。

Opera 不支持 CORS。第 12 版将支持它,但这不是一个选项,因为用户应该先采用这个新版本,而且不会在 2 天内。

我需要进行跨域请求,因为 Web 客户端应用程序必须请求位于另一个域中的 RESTful 服务层。没办法。

将所有内容切换到 HTTPS 会使服务层代理方法再次工作(这是预期的行为)。

无论如何,谢谢,因为这两个答案都对我得出这个结论有很大帮助。

更新

@Sam 添加了一条任何人都可能感兴趣的评论。这是关于如何在 Internet Explorer 8 和 9 中获取 CORS(参见 #7):http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx

【讨论】:

对于任何想要通过从 HTTP 到 HTTPS 的跨源请求来支持 IE8 和 IE9 的人,这里有使用 Microsoft 描述的 postMessage API 的解决方法(参见 #7):blogs.msdn.com/b/ieinternals/archive/2010/05/13/… @Sam 我已经用你的信息更新了我自己的分析器。感谢您的评论;)【参考方案3】:

您应该重新考虑通过 HTTPS 访问整个页面,或者至少确定这是不可行的。

通过 HTTP 加载初始页面和脚本,用户无法保证该脚本是您最初打算发送的脚本并且没有被第三方操纵(例如,通过键盘记录他的密码)。这意味着任何绕过 SOP 的 HTTPS 请求都不会提供与来自最初通过 HTTPS 提供的页面的 HTTPS 请求相同的安全保证。

【讨论】:

你回答的第一部分是好的,但我在我的问题中指出我不会将整个页面切换到 HTTPS。我绝对确定不安全的数据没有敏感信息(这仅来自异步服务调用)。最后一个陈述也回答了你的第二部分。检查@PiTheNumber 答案。我的第二条评论谈到了其他一些相关的问题解决方案,这可能是合适的解决方案。我正在努力。 关于第二部分,使用所谓的解决方案应该足以确保调用者是所需的脚本。 如果您使用的是 Facebook 页面选项卡,例如,如果用户使用 HTTP 浏览 Facebook,您将无法通过 HTTPS 加载页面。 @JackMarchetti:但这有什么不同呢?在 HTTP 页面中访问 HTTPS 服务从根本上来说仍然是不安全的,所以如果您不关心安全性,为什么不让您尝试 AJAX 的服务也可以通过 HTTP 使用?【参考方案4】:

我正在使用Access-Control-Allow-Origin。您只需发送标头就可以了。

另见AJAX, Subdomains, and SSL

【讨论】:

操作,抱歉,我已经更新了我的问题,CORS 不是一个选项。这是理想的,但您知道当前浏览器支持哪个。 另外,您的链接很有用。我将根据包含使用 HTTPS 调用 HTTPS 的脚本来检查该解决方案。让我们看看。 什么浏览器不支持?您可以使用 XDomainRequest 使其在 IE 中工作。有一个 jquery 传输。 Opera 在 11.x 主干中不支持 CORS(12 会支持)。当然 Opera 不是桌面版的大型 Web 浏览器,但它是移动版的。顺便说一句,我考虑 CORS 已经很多小时了,也许我需要走这条路,因为这是解决这个问题的正确方法。 我尝试使用 XDomainRequest 但仍然拒绝访问。被告知你不能从 http 转到 https

以上是关于JavaScript 跨域调用:从 HTTP 调用到 HTTPS的主要内容,如果未能解决你的问题,请参考以下文章

web api 跨域请求,ajax跨域调用webapi

跨域解决方法

JavaScript跨域方式总结

跨域问题

javascript 跨域调用js文件问题.....

跨域详解