为啥 AJAX 请求仅限于同一个域?

Posted

技术标签:

【中文标题】为啥 AJAX 请求仅限于同一个域?【英文标题】:Why are AJAX requests limited to same domain?为什么 AJAX 请求仅限于同一个域? 【发布时间】:2011-03-10 13:27:09 【问题描述】:

我觉得真正令人困惑的是,为什么 AJAX 请求仅限于同一个域?这背后的原因是什么?

我认为从外部位置请求文件没有任何问题,发出 XMLHTTP 请求的服务器似乎也可以很好地获取并发布到外部位置。

【问题讨论】:

这可能是因为您的密码不会被发送到某个伪造的服务器... 但是您所在的网站必须通过脚本发送您的密码,而且理论上他们已经知道密码,所以这似乎毫无意义? 【参考方案1】:

Tom,它不是“Ajax 请求限制”。 AJAX 基于 javascript。出于安全原因,禁止跨域访问 JavaScript。如果你真的想做跨域 Ajax,你可以做一个 hack。

YourPage(Ajax) ----> YourServer ----> ExternalDomain

您可以使用 Ajax 调用服务器中的页面,您的域将使用服务器端调用外部域,并获取结果然后作为 Ajax 响应返回给您。 当然,向 ExternalDomain 服务器发出的请求将被调用,而不会发送驻留在浏览器内存中的 ExternalDomain cookie。那是因为请求是由您的服务器而不是您的浏览器完成的。

【讨论】:

【参考方案2】:

图片如下:

你来到我的神话般的网站 www.halfnakedgirls.com。看着看起来像是关于人体生理学的技术文档,你会很开心,但在你背后,一些 JavaScript 行正在执行对另一个域的一些请求,比如 www.yourpaypallike.com。

http://www.yourpaypallike.com/account/transfer?to=badguy@evilwebsite.com&amount=984654http://www.mymailprovider.com/mails/export?format=csv 之类的请求。

你现在明白为什么它被禁止了吗? =)

【讨论】:

谢谢,这很有意义。假设用户登录到 Paypal,那么恶意网站可以访问外部站点,就好像他们登录到它一样。 假装我是个傻瓜,我不明白为什么禁止这样做。 halfnakedgirls.com 是否能够使用您的贝宝 cookie 向贝宝发送恶意指令,即使它本身无法读取这些 cookie?而使用“站点重定向”解决方法时,cookie 数据会被删除,paypal 不会认为您已登录? 没错,因为您的浏览器会自动将 cookie 添加到发出的每个请求中。您请求 yourpaypallike.com,浏览器会沿着 ajax 请求发送 paypallike.com 的 cookie。 “站点重定向”确实会剥离 cookie。对“中间人服务器”的第一个请求不包含最终目标 (youpaypallike.com) 的 cookie,因此当中间人服务器将请求传输到 paypalike 时,没有 paypallike cookie。 为什么浏览器不能在没有任何cookie的情况下发出请求?【参考方案3】:

这是出于安全目的 - 如果网站可以在客户端对他们想要的任何域执行 AJAX 调用,则会带来严重的风险。

但是有一些方法可以解决这个问题 - 您可以让您的 AJAX 调用同一域上的 php 脚本,而后者又可以调用另一个域中的脚本并返回它。不过,这不会使用浏览器作为通信媒介,而是使用您的网络服务器。

【讨论】:

谢谢,我知道这会带来安全风险,但还没有人解释这是什么。【参考方案4】:

这里有一些信息可以满足您的问题: http://en.wikipedia.org/wiki/Same_origin_policy

【讨论】:

感谢您的链接,但它仍然没有给我一个令人满意的理由为什么不允许它,它只是将其描述为一个安全概念。

以上是关于为啥 AJAX 请求仅限于同一个域?的主要内容,如果未能解决你的问题,请参考以下文章

Nginx小功能合集

Nginx应用结业篇---3

ajax跨域简单请求和复杂请求

为啥 AddMultiplicationEquality 仅限于 2 个变量?

为啥弹性项目仅限于父尺寸?

为啥大多数 Microsoft Graph 功能仅限于用户访问