Javascript CORS—它是客户端的东西、服务器端的东西还是传输级别的东西?

Javascript CORS—它是客户端的东西、服务器端的东西还是传输级别的东西?,javascript,cors,Javascript,Cors,我在努力理解。据我所知,它使您能够限制哪些域可以访问服务器上的资源。然而,这似乎不是全部的故事。例如,我有一个没有启用CORS的web服务。我无法通过jQuery从我的web应用程序点击此web服务(该应用程序正在本地主机上运行)。然而,我可以点击邮递员的网络服务。所以,我有点困惑。是否有涉及CORS的额外客户端工作?实际上两者都有一点。您的浏览器将阻止CORS请求,除非请求的来源(即引用者URL域)位于目标上的白名单中,或者目标批准所有请求,而不管其来源如何 在这两种情况下,都会添加所需的标头

我在努力理解。据我所知,它使您能够限制哪些域可以访问服务器上的资源。然而,这似乎不是全部的故事。例如,我有一个没有启用CORS的web服务。我无法通过jQuery从我的web应用程序点击此web服务(该应用程序正在本地主机上运行)。然而,我可以点击邮递员的网络服务。所以,我有点困惑。是否有涉及CORS的额外客户端工作?

实际上两者都有一点。您的浏览器将阻止CORS请求,除非请求的来源(即引用者URL域)位于目标上的白名单中,或者目标批准所有请求,而不管其来源如何

在这两种情况下,都会添加所需的标头(Access Control Allow Origin),告知浏览器可以将请求发送到目标


这可确保有恶意意图的人在用户不知道的情况下无法向另一个域发送请求。

服务器负责报告允许的来源。web浏览器负责强制要求仅从允许的域发送请求

当请求中包含时,应用于请求。这包括从JavaScript发出的请求和POST请求。它并不是应用于所有资源。来源是发出请求的协议、主机和端口。JavaScript发出的请求使用加载JavaScript的源,而不是从中加载JavaScript的源

当CORS未启用时,浏览器将依赖于。同源策略仅应用于脚本。浏览器将只允许从加载页面的相同来源加载脚本。当明确允许非来源时,假定采用相同来源策略

浏览器以外的HTTP客户端不会使用同源策略或CORS。从这些其他HTTP客户端发出的请求没有来源。除非Postman桌面应用程序模拟浏览器,否则它将能够向任何URL发出请求

需要CORS和同源策略,因为浏览器不会隐式信任其访问的网站向其他网站发出请求。它们不保护源站点,而是保护接收跨源请求的站点。这就是为什么允许的来源取决于目标服务器

如果没有这些策略,重复加载网站的简单脚本可能会通过广告网络或脚本注入进行分发,然后任何加载脚本的浏览器都会导致网站上的拒绝服务攻击。使用CORS和同源策略,浏览器将限制此脚本的影响

CORS提供的另一个重要保护是防止。它防止一个站点向另一个站点发出某些类型的请求。这些请求将使用任何先前创建的令牌(如会话令牌)进行

CORS示例:


web浏览器从
www.example.com
加载页面。该页面包含一个向
www.example.org
发出请求的脚本。请求的来源是
www.example.com
。浏览器要么发出请求,要么首先发送
OPTIONS
请求(飞行前请求)。当位于
www.example.org
的服务器从
www.example.org
以外的来源接收到请求时,它会用响应头
Access Control Allow origin
进行响应,该响应头告诉浏览器允许发出请求的来源。它还可以使用其他标头进行响应,如
访问控制允许方法
访问控制允许标头
,这些标头可以限制允许请求的类型。当浏览器被告知允许哪些来源时,它将阻止来自不允许的来源的未来请求。

那么CORS是一种安全措施吗?我很难将其视为安全组件,如果web浏览器有责任强制执行该请求仅从允许的域发送。@ZachTempleton CORS是放宽同源策略的一种方法。使用同源策略是因为浏览器不信任他们访问的网站或加载的内容。它可以防止一个站点恶意干扰另一个站点。@jpenna不,它还有助于防止跨站点请求伪造攻击。如果一个站点使用cookie进行身份验证,而不使用同源策略,那么注入的脚本可以使用该身份验证发出请求是的,我也很难将其视为安全性。如果我只编写自己的web浏览器,而忽略CORS标题会怎么样?@redigafi,那么没有人会使用该浏览器:)-但实际上你没有编写自己的()。问题是,如果使用不遵守相同来源政策的浏览器登录您的银行帐户,那将是极其危险/疏忽的。浏览器正在加载来自internet的“随机”脚本,如果没有有效的同源策略,这些脚本可能会破坏您委托给浏览器的信息。您所说的“这确保有恶意意图的人在用户不知情的情况下无法向其他域发送请求”是什么意思?恶意用户可以将自己的服务器设置为启用CORS,然后使用XSS(例如XSS)将用户信息发送到该服务器,用户永远不会知道。是的,但要实现这一点,您必须加载受损网站。CORS不是一种可以阻止一切的神奇药丸,但它是XSS的一种缓解方法