为公共和只读Web服务启用CORS是否安全?

Mat*_*s M 7 security cors

启用CORS有几个安全问题:

  • CSRF
  • 暴露受保护的数据

但是,对于支持全局CORS的公共和只读Web服务,我有什么问题吗?

Access-Control-Allow-Origin: *
Run Code Online (Sandbox Code Playgroud)

我的假设:

  • CSRF不相关,因为webservice是readonly.
  • 窃取受保护的数据是不相关的,因为Web服务是公开的.

sid*_*ker 10

以下是Fetch规范(定义CORS)的相关内容:

基本安全的CORS协议设置

对于通过IP身份验证或防火墙保护数据的资源(遗憾的是相对常见),使用CORS协议是不安全的.(这就是为什么必须发明CORS协议的原因.)

但是,否则使用以下标头是安全的:

Access-Control-Allow-Origin: *
Run Code Online (Sandbox Code Playgroud)

即使资源基于cookie或HTTP身份验证公开了其他信息,使用上述标头也不会显示它.它将与API共享资源XMLHttpRequest,就像它已经curl和它共享一样wget.

因此,换句话说,如果一资源不能从连接到使用网络的随机设备访问curlwget上述报头不被包括在内.但是,如果可以访问它,那么这样做是完全可以的.

Fetch/CORS规范的作者在相关的博客文章中详细介绍了一下:

Access-Control-Allow-Origin: *只要资源不是Intranet(防火墙后面)的一部分,就可以完全安全地增加任何资源.换句话说,您可以使用wget或从Internet上的服务器获取的URL curl.对于您的基本网站,这包含网站上的所有资源.所述Access-Control-Allow-Origin标头(CORS的一部分)告诉浏览器资源可以被共享.

即使资源包含基于cookie的机密信息或请求中的HTTP身份验证数据,包括标头和共享资源仍然是安全的,因为浏览器将在没有任何cookie或HTTP身份验证数据的情况下发出请求.如果浏览器确实使用cookie或HTTP身份验证数据发出请求,它将永远不会共享资源,因为这将需要额外的标头Access-Control-Allow-Credentials,以及上述标头的不同值.

因此,请继续安全地与其他应用程序共享您的公共数据!