JavaScript中的跨域数据访问

时间:2009-08-07 11:09:52

标签: javascript security cross-domain

我们的网络上托管了ASP.Net应用程序,并向特定客户端公开。该客户希望能够将自己服务器中的数据导入我们的应用程序。使用HTTP请求检索数据并进行CSV格式化。问题是他们不想将他们的服务器暴露给我们的网络,并且要求在客户端进行导入(所有客户端都来自与他们的服务器相同的网络)。

所以,需要做的是:

  1. 他们从我们的服务器请求导入页面
  2. 页面上的客户端脚本向其服务器发出请求以获取CSV格式的数据
  3. 数据将发送回我们的应用程序
  4. 当两个服务器位于同一个域时,这不是一个挑战:一个简单的隐藏iframe或类似的东西可以解决这个问题,但在这里我得到的是跨域“访问被拒绝”错误。他们还拒绝更改数据格式以返回JSON或XML格式的数据。

    到目前为止我尝试和学到的是:

    1. 隐藏的iframe - “拒绝访问”
    2. XMLHttpRequest - 行为取决于浏览器安全设置:可能有效,可能会在用安全警告唠叨用户时工作,或者可能根本不起作用
    3. 动态脚本标记 - 如果他们可以以JSON格式返回数据
    4. 就行了
    5. IE客户端数据绑定 - 相同的“拒绝访问”错误
    6. 在放弃之前还有什么我可以尝试的,并说如果不将他们的服务器暴露给我们的应用程序,更改他们的数据格式或更改他们的浏览器安全设置是不可能的吗? (顺便说一下,DNS技巧不是一种选择)。

5 个答案:

答案 0 :(得分:3)

如果

JSONP能够以JSON格式提供服务,那么

Same Origin Policy可能就是您的最佳选择。除此之外,您将始终遇到跨域调用的{{3}}问题。您是否考虑过执行服务器端调用来向其服务器发出HTTP请求?

答案 1 :(得分:2)

对于您的客户来说可能为时已晚,但由于您可以控制这两个域,因此可以尝试EasyXDM。它是一个包含跨浏览器怪癖的库,它提供了一个易于使用的API,用于使用该浏览器的最佳可用机制在不同域之间的客户端脚本中进行通信(例如,postMessage,如果可用,则为其他机制)。

警告:您需要控制两个域才能使其工作(“控制”意味着您可以在两个域上放置静态文件)。但是您不需要任何服务器端代码更改。

答案 2 :(得分:1)

您的客户端是您的应用程序提供的JavaScript,对吗?

您的客户端只能向您的applciation发送请求(跨站点脚本编写预防),您看到的错误是什么?

假设是,那么解决方案是让您的应用程序提供“代理”服务。您的浏览器代码可以向您的服务器询问一些数据。您的服务器可以自由地向它喜欢的任何服务器发出Http请求(没有浏览器对象)。因此,您可以实现一些小服务来获取cvs数据并将其呈现给您的应用程序。

如果您的客户正在使用它,您甚至可以选择将该CSV数据映射到JSON。

答案 3 :(得分:0)

你不能只在他们的服务器上托管JS文件吗?这应该允许该文件中的脚本将ajax调用回服务器。

答案 4 :(得分:0)

你可以试试闪光灯。如果你将这个yourdomain.com/crossdomain.xml放在你的root中,你就可以从mysite.com发出跨域请求。

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<allow-access-from domain="www.mysite.com" to-ports="25" />
</cross-domain-policy>