为啥 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=984654
或 http://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 请求仅限于同一个域?的主要内容,如果未能解决你的问题,请参考以下文章