CORS是双系统检查?

时间:2017-04-08 15:30:42

标签: cors

阅读CORS(https://spring.io/understanding/CORS)我有下一个疑问:

  1. 我在CORS中认为请求在客户端被阻止但在服务器中没有阻止,但事实并非如此。 CORS是一种双重检查安全性,无论是在客户端还是在服务器中,对吗?如何在服务器中检查?
  2. 不允许使用跨域请求,因为出于安全原因,我不想从我的Web应用程序外部获取请求....对吗?
  3. 如果我不是浏览器并且我不执行任何安全检查怎么办?假设我的网络应用的域名是http://mywebapp.com:80,并且要让客户请求http://mywebapp.com/customers。我希望从域http://mywebapp.com:80完成最后一次请求。如果我创建一个Java应用程序向http://mywebapp.com/customers发出请求,我可以得到答案,尽管事实上我并非从源http://mywebapp.com:80询问这个问题,对吗?
  4. 由于

2 个答案:

答案 0 :(得分:2)

  1. 服务器可以检查Origin请求标头。 https://fetch.spec.whatwg.org/#http-responses更详细地解释了服务器可以包含(和排除)的标头。
  2. 是的,虽然你需要警惕XSRF等。网站上可能存在多种攻击。
  3. 是的,这是对的。更重要的是,如果您不使用HTTPS,您的数据将全部泄漏。

答案 1 :(得分:2)

  

CORS是客户端和服务器中的双重检查安全性,对吧?

没有。见https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS。 CORS协议中没有服务器端检查,如https://fetch.spec.whatwg.org/中所定义。

  

如何在服务器中检查?

CORS未在服务器端强制执行。浏览器是唯一的执行点。服务器只需设置特定的响应头即可参与协议。

具体来说,当服务器收到请求时,CORS协议不要求服务器检查它是否是跨源请求。服务器可能会检查是否存在Origin请求标头,并根据是否找到它或它的值来执行不同的操作,但CORS协议不依赖于服务器是否执行此操作或不。

此外,CORS协议绝对不要求服务器阻止请求或执行特定于请求的任何其他操作。相反,服务器只需在响应中包含Access-Control-Allow-Origin响应标头。

浏览器总是像往常一样接收响应 - 但如果它们是跨源请求的响应,那么浏览器通过拒绝公开响应来实现CORS协议的前端/客户端JavaScript代码Web应用程序,除非响应包含Access-Control-Allow-Origin响应标头,表明服务器正在选择允许请求跨域。

  

不允许使用跨域请求,因为出于安全原因,我不想从我的Web应用程序外部获取请求....对吗?

CORS协议不会阻止对任何资源的所有请求。除非您的Web资源在Intranet内运行,或者在某种防火墙后面运行,否则任何非浏览器工具/应用程序仍然可以访问您的Web资源。 CORS不阻止它们。

对于已经可以通过HTTP公开访问而没有限制的Web资源,CORS并不是特别有用。相反,CORS主要用于在Intranet内部或防火墙后面运行的Web资源的情况,并且仅受基于IP的身份验证的保护,该身份验证假定Intranet /防火墙内的任何人都是可信任的。

CORS要解决的问题是,当用户访问此类Intranet /防火墙内的任意外部Web应用程序时,该Web应用程序以与用户相同的权限运行。因此,如果Intranet /防火墙内的Web资源仅基于IP地址信任用户,那么在没有跨源限制的情况下,任何外部Web应用程序也以与用户相同的权限/信任运行。

  

如果我不是浏览器并且我没有执行任何安全检查呢? ...如果我创建一个Java应用程序向http://mywebapp.com/customers发出请求,我可以得到答案,尽管事实上我并非从原点http://mywebapp.com:80询问这个问题,对吗?

是。 CORS协议没有任何限制。