请求另一个域/服务器上的内容

2023-12-02

我正在尝试请求位于另一个域/服务器上的数据,但是当我尝试发送请求时遇到异常。

var request = new XMLHttpRequest();
request.open("GET", "http://www.w3schools.com/ajax/cd_catalog.xml", false);
request.send();

错误:

uncaught exception: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE)" nsresult: "0x80004005 (NS_ERROR_FAILURE)"]

这是请求不在同一域/服务器上的内容的正确方法吗?或者还有其他方法可以实现这一点吗?

我正在 Firefox 8.0 中对此进行测试,但我想要一个适用于所有主要现代浏览器的解决方案。


出于安全原因,这样的请求将不起作用。想象一下,如果任何域可以访问任何其他域的数据 - 您最终会发现任何站点(例如 www.sketchyattacksite.com)都能够从任何其他站点(例如 www.bankofamerica.com)提取任意内容,包括经过身份验证的用户的机密会话信息。这同源政策由所有现代浏览器实现的,旨在防止此类安全违规的发生。

有几种常见的方法可以绕过同源策略:

  1. 您请求数据的域可以将所述数据返回为JSONP(它允许您像外部脚本一样加载它,不受同源策略的约束)。通常网站会在其 API 中提供 JSONP 格式,例如:https://graph.facebook.com/cocacola?callback=name_of_function_to_pass_data_via_jsonp
  2. 跨域资源共享 (CORS)是最新的标准,因此仅适用于较新的浏览器,但允许站点指定(通过 HTTP 标头)允许哪些域访问其数据。例如,如果美国银行出于某种原因想要允许 www.sketchyattacksite.com 向 www.bankofamerica.com 发出请求,他们可以返回一个Access-Control-Allow-Origin: sketchyattacksite.com header.
  3. 服务器端代理。您可以在服务器上创建一个处理程序,其唯一功能是检索您的目标http://www.w3schools.com/ajax/cd_catalog.xml文件并将其返回到您的域中。请注意,这解决了可能传递机密数据的问题,因为发出请求的不是用户的浏览器,而是您的服务器(无法访问 w3schools.com 上用户的 cookie)。

在这种特殊情况下,答案似乎是#3(服务器端代理)。为什么?因为您无法控制您请求数据的站点(这意味着您无法利用 #1 或 #2,除非 w3schools.com 本身选择实施它们)。

这是一个服务器端代理的简单 PHP 示例,由雅虎提供。关键是它被锁定为仅从特定域中提取内容(以便不良行为者无法将其用于看似代表您发出的任意请求),除此之外,它就像通过以下方式请求目标 URL 一样简单卷曲并将其返回给用户。请注意,您可能还想添加缓存以防止服务器端代理的每次加载都触发对http://www.w3schools.com/ajax/cd_catalog.xml file.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

请求另一个域/服务器上的内容 的相关文章

随机推荐