Javascript 跨源xhr和同源策略

Javascript 跨源xhr和同源策略,javascript,php,xmlhttprequest,same-origin-policy,cross-domain-policy,Javascript,Php,Xmlhttprequest,Same Origin Policy,Cross Domain Policy,这是一个我认为我理解的概念,但最近发现我完全错了。我在互联网上到处寻找,找到了很多小细节和代码片段的例子,但我仍然不了解它阻止了什么,为什么阻止它,是为了谁。因此,这与其说是一个问题,不如说是一个高层次的解释 不管怎样,我想我是这样理解的: 假设我有域A.com和域B.com。每个服务器都有自己的apache服务器和IP地址。 我将一个html文件从域A.com加载到浏览器中。浏览器执行对B.com/doStuff.php的POST-XMLHttpRequest,由于设置了相同的域策略,因此失败

这是一个我认为我理解的概念,但最近发现我完全错了。我在互联网上到处寻找,找到了很多小细节和代码片段的例子,但我仍然不了解它阻止了什么,为什么阻止它,是为了谁。因此,这与其说是一个问题,不如说是一个高层次的解释

不管怎样,我想我是这样理解的:

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

因此: 谁的相同域策略是相关的?我想答案是B.com/doStuff.php的。。。正确的?因此,当A发送请求时,B检查请求头的来源,并说“哎呀,不同的域,不会听你的”。或者A发送请求,B用指定“相同域策略”的标题响应,然后浏览器检查是否因为指定了相同的域策略,并且A请求标题中的域和B请求中的域不匹配,所以浏览器拒绝发送xhr

如果是这样的话,那么不允许跨源请求的意义似乎是因为“我不希望除我之外的任何人访问我的API”。就这些吗?因为你不想用某种身份验证来解决这个问题吗?难道有人就不能用一个伪造的源报头构造一个HTTP请求吗

或者这是为了保护用户?如果是这样的话,阻止他们调用你的API怎么能保护任何人呢


我很困惑…

这个想法是你不想通过Javascript从服务器A访问服务器b。如果您正在与API交互,您将使用javascript调用您自己服务器的后端代码,然后调用另一台服务器

接收请求的服务器决定


否,服务器拒绝响应。更确切地说,在现代浏览器中,它是由。这意味着对于每个跨源请求,首先浏览器会自动发送一个选项请求,其标题与预期请求的标题完全相同,但没有请求正文。服务器也只使用头进行响应。响应中的访问控制头将让客户端浏览器知道是否会根据服务器的策略满足请求。从某种意义上说,浏览器正在阻止请求,但这只是因为它已经与服务器交换了请求/响应对,并且知道尝试请求没有意义。如果在这种情况下伪造请求,服务器仍将拒绝提供该请求。

它不会阻止机器使用(例如)curl获取url,它只会尝试停止基于浏览器的获取。要阻止非js威胁,必须进行身份验证。关键是,未经您明确允许,未签名的JS无法重新嵌入站点内容。@dandavis是不是很容易回避?只需让服务器获取javascript请求(例如使用curl),然后将其传递回javascript。。。重点是什么?重点是控制和责任:服务器/php代码注册到信用卡上,普通的旧网页不注册。在您的示例中,执行curl的服务器可以很容易地识别和阻止,但是如果流量来自注入广告的javascript,那么请求可能来自任何地方…@dandavis-但是如果我们依赖于现代浏览器在其发送的源文件头中兼容,那么不管怎样,那么恶意javascript的来源也同样容易找到(它将在HTTP请求的头中发送),不是吗?对于受损的广告,js将在您的域上加载可能来自数千个其他域的内容。SOP应该保护受版权保护的材料不被无形地混搭在一起,并且在没有广告的情况下呈现。这不是世界上最全面的政策,你仍然可以在任何地方提交表单,从任何地方加载图像和脚本,使用jsonp等等。它实际上更多的是来自早期web的一个工件,每个web专业人士都认为它是给定的。CORS在选择加入的基础上放宽了限制,而不是完全取消限制。它阻止了成群结队的僵尸,这就是它……但为什么呢?“我不希望有人从javascript访问我的API,但如果他们从PHP访问我的API,那就好了”这似乎是证明这个基础设施的一个完全肤浅的理由……好吧,这样才有意义。谢谢你澄清这一点!但是——那么,我是否正确地认为这整件事的唯一目的是不允许人们访问您的API,但只能通过javascript访问?(也就是说,你的API仍然可以被其他任何东西访问,javascript不能这样做的唯一原因是浏览器不支持JS编辑它的源标题?)。那是在保护谁?您的API仍然可以访问—它只需要一个简单的解决方案(告诉您的服务器进行调用,然后将其传递回您的js)。“只需要一个简单的解决方案”是一个不太小的“正义”,正是这一区别构成了基本客户端web安全的基础。一个php服务器可以关闭,一个胭脂脚本更难消除,并且造成的问题比任何人和他们的兄弟编写的curl或php都大得多。@dandavis-基本客户端web安全的基石?!如果存在一个我(一个被承认的新手)可以轻松利用的解决方法(同样,可能不是这样-我仍在等待/希望得到纠正…),客户端web就完蛋了!充其量,这似乎只是懒惰黑客的一个前线障碍。。。?如果这就是全部,那就这样吧。但我觉得我一直在听闲聊,好像这是一件大事。(我真的没有不尊重的意思
Who's same-domain-policy is relevant?
... the BROWSER refuses to send out the xhr?