交叉起源xhr和同源政策

时间:2014-01-13 20:58:50

标签: javascript php xmlhttprequest same-origin-policy cross-domain-policy

这是我认为我理解的概念,但最近发现我错了。我在互联网上看了很多,并找到了很多小细节和代码片段的例子,但我仍然不了解它阻止了什么以及为什么它会阻止它以及为了它的缘故。所以这更像是对高级别解释的要求而不是问题。

无论如何,这就是我认为我理解的内容:

假设我有域名A.com和域名B.com。每个apus服务器上都有自己的IP地址。 我将域A.com中的html文件加载到浏览器中。浏览器对B.com/doStuff.php执行POST XMLHttpRequest,由于设置了相同的域策略,因此失败了。

所以: 谁的同域政策是相关的?我认为答案是B.com/doStuff.php的......对吗?因此,当A发送请求时,B检查源的请求标头并说“呐喊,不同的域,不会听你”。或者A发送请求,B使用指定“相同域策略”的标头进行响应,然后浏览器检查是因为指定了相同域策略,并且A请求标头中的域不匹配来自B请求的那个BROWSER拒绝发送xhr?

如果是这种情况,似乎不允许跨源请求是因为“我不希望除了我以外的任何人访问我的API”。这就是全部?因为您不想用某种身份验证来解决这个问题吗?有人不能只使用假的起源头构建一个HTTP请求(简单地说谎)吗?

或者这是否应该以某种方式保护用户?如果是这样的话,如何阻止他们调用你的API来保护任何人?

我很困惑......

2 个答案:

答案 0 :(得分:1)

Who's same-domain-policy is relevant?

接收请求的服务器决定。

... the BROWSER refuses to send out the xhr?

不,服务器拒绝回复。更确切地说,在现代浏览器中,它由preflighted requests完成。这意味着对于每个跨源请求,首先由浏览器自动发送OPTIONS请求,其头部与预期请求完全相同但没有请求体。服务器仅响应标头。响应中的Access-Control标头将让客户端浏览器根据服务器的策略知道是否满足请求。从某种意义上说,浏览器正在阻止请求,但这只是因为它已经与服务器交换了请求/响应对,并且知道尝试该请求没有意义。如果您在这种情况下伪造请求,服务器仍将拒绝提供请求。

答案 1 :(得分:0)

这个想法是你不想通过Javascript从服务器A访问服务器b。如果您正在与API进行交互,则可以使用javascript调用自己服务器的后端代码,然后调用其他服务器。