CORS和CSP有什么区别?


71

在我看来,称为跨域资源共享(CORS)内容安全策略(CSP)的技术在目的和实施方面似乎非常相似。

两者似乎都允许您通过HTTP响应标头将网页的原始版本所合并的资源的来源列入白名单。我可以看到的唯一区别是,CSP在HTTP响应中可以批准的内容上似乎更细粒度。

Answers:


85

CORS允许放宽域的“同源起源”策略

例如,正常情况下,如果用户同时登录example.comexample.org,Same Origin Policy会阻止向响应example.com发出AJAX请求example.org/current_user/full_user_details并获得对响应的访问权限。

这是Web的默认策略,可防止在同时登录多个站点时泄露用户数据。

现在有了CORS,example.org可以设置一个策略,说它将允许源https://example.com读取AJAX做出的响应。如果example.comexample.org都由同一公司运行,并且在用户的浏览器中允许源之间共享数据则。它仅影响事物的客户端,而不影响服务器端。

另一方面,CSP设置了可以在当前站点上运行哪些内容的策略。例如,是否可以内联执行JavaScript或.js可以从中加载哪些域文件。这可以作为抵御XSS攻击的另一道防线,在这种情况下,攻击者将尝试将脚本注入HTML页面。通常,输出将被编码,但是说开发人员只忘记了一个输出字段。由于该策略阻止执行嵌入式脚本,因此阻止了攻击。


4
比所有的mozilla / html5rocks / w3c文档更加清晰明了。谢谢。
JepZ

60

CORS允许站点A授予站点B许可(使用访问者的浏览器和凭据)从站点A读取(可能是私有的)数据。

CSP允许站点阻止自己从意外来源加载(可能是恶意的)内容(例如,作为对XSS的防御)。


站点A上可以使用CSP来阻止站点A从站点B读取数据吗?我主要是在谈论xhr请求。
Vlas Bashynskyi

我可以说CORS是CSP可以完成的工作的子集吗?
mathk

1
@mathk —否。正如我在回答中所说,它们是完全不同的东西。
Quentin

1
我的意思是,如果您不允许浏览器从站点B下载内容,那么您还可以保证不会使用CSP将任何内容发送到站点B?
mathk

@mathk —阻止站点A将数据发送到站点B(可以通过CSP实现)与阻止站点A从站点A读取数据(这是默认行为,但可以使用CORS放松)完全不同。
昆汀

35

上面的答案均未给出CSP和CORS之间的清晰明了的区别。这是我对它们的思考方式:

假设我们有一个abc.com网站,希望向def.net发送请求。

  1. 当用户在浏览器中访问abc.com时,abc.com服务器返回abc.com HTTP响应,此响应中的CSP限制可以防止浏览器中的abc.com向def.net发出请求。
  2. 如果abc.com HTTP响应中没有CSP限制,则浏览器中的abc.com可以向def.net发送请求。
  3. 收到请求后,def.net服务器将以def.net HTTP响应进行响应,此响应中的CORS限制可能会阻止浏览器中的abc.com加载它。(请注意,默认情况下,除非CORS另行指定,否则同源策略将限制响应的加载)

因此,在上面的示例中,CSP保护abc.com,而同源策略(缺少CORS)保护def.net


在此示例中,Same Origin策略不会保护def.net,而如果启用了CORS会删除此保护?
史蒂夫·

@Steve,您说得对,有点用词不当,我已经更新了答案以反映出来。
天堂

2
说Content-Security-Policy阻止对外部资源的调用,而Cross-Origin-Resource-Sharing阻止对外部资源的调用,这是正确的简化吗?提供一个例子。为了使abc.com在iframe中显示def.net,abc.com不得以其CSP设置阻止def.net,并且def.net不得以其CORS设置阻止abc.com。
乔迪·索瓦尔德

1
@JodySowald似乎很合适。
天堂

3

CORS向第三方检查使用其服务的授权。因此,第三方提供或拒绝授权。

因此,例如,如果www.example.com中的页面需要向www.example.org发出请求,我们需要发送一个发送到www.example.org的OPTIONS请求,并以Origin:www.example.com作为请求的前身授权。现在,www.example.org提供或拒绝授权。

CSP通过指定可以从何处加载特定类型的内容来防止网页无意中从第三方加载恶意内容。因此,例如,您可以使用指令为以下每个脚本,css,媒体等提供有效的源

例:

内容安全策略:default-src'none'; script-src'self'www.google-analytics.com ajax.googleapis.com; connect-src'自我'; img-src'自我'; style-src'self';

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.