如何从安全起点向不安全端点发送XMLHttpRequest

时间:2016-08-17 10:55:20

标签: javascript html http xmlhttprequest cors

简介

我试图从我们部门的内部网页面向不同部门的网络服务运行CORS网络请求,但我收到了错误消息。由于我对此很陌生,我无法确定原因是否是由于不同的协议造成的。

错误

当尝试运行CORS请求时,IE11提供Access is Denied,而Chrome 52提供以下内容:

Mixed Content: The page at {MyPage} was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint {ServicePage}. This request has been blocked; the content must be served over HTTPS.`

意图

创建一个JS文件,将事件处理程序附加到包含input属性的所有必需class='contactLookUp'元素。此文件仅在我们位于Intranet上的部门页面上引用,其中大多数页面使用https协议。在输入更改时,这会将XMLHttpRequest发送到另一个端点,一个仍在公司内部网中,但在我们的部门控制之外,并使用http协议。这将以JSON格式返回业务中的联系人,此时我将在页面中注入一些HTML,以便用户可以轻松选择所需的联系人。

页面的网址

以下是Intranet中的页面位置。 [name]是指公司名称,[Location1][Location2]是不同的目录。

开始点:

https://[name]01test.[name].abc/[Location1]/HTMLPage1.html

终点:

http://[name]intranet02.[name].abc/[Location2]/TelephoneDirectory/TelephoneDirectoryService.svc/GetPeople?term=[SearchTerm]

一些可能的原因

我对CORS,jQuery和Web开发都很陌生,所以我不确定我想做什么是可能的,但我相信以下可能是原因:

  • 混合内容(Chrome提供的错误让我认为这是原因)
  • 服务器未启用CORS(由于服务器不属于我们部门的控制范围,因此我不想询问IT是否已启用或启用此功能,除非我确定原因并非如此。混合内容)

我尝试了什么

  • 我尝试将结束点更改为https,但这会返回404 Page not Found错误

脚本

var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr) {

    // Check if the XMLHttpRequest object has a "withCredentials" property.
    // "withCredentials" only exists on XMLHTTPRequest2 objects.
    xhr.open("GET", url, true); // <= Error here
}

1 个答案:

答案 0 :(得分:0)

您的网页尝试访问的端点需要支持CORS。如果不是,它将无法在飞行前检查时回复您的浏览器。虽然CORS只允许跨源请求,但它并不打算作为安全连接的一种方式。

您的浏览器(正确)拒绝访问该资源,因为https旨在成为安全连接,并且您尝试让浏览器连接到不安全的资源,从而打开安全漏洞。

当您将目标端点更改为https时,您将获得404,因为端点不会监听默认的https端口443(或根本不是)。

您可以检查Web服务是否正在侦听https的其他端口,尽管可能是一个很长的镜头。

您的另一个选择是构建充当代理的Web服务。然后,制作XMLHttpRequest的Web应用程序会向您的代理发出请求,而代理会向电话目录服务发出不安全的http请求,并将该结果返回给您的请求客户端(浏览器)。

基本上你需要建立一座桥梁。