CORS 和 CSP 之间有什么区别?

What is the difference between CORS and CSPs?

在我看来,这些技术被称为 Cross-Origin 资源共享 (CORS) 内容安全策略 (CSP) 在目的和实现上似乎非常相似。

两者似乎都允许您通过 HTTP 响应 headers 将未妥协版本的网页所包含的资源来源列入白名单。我能看到的唯一区别是 CSP 似乎更 fine-grained 您可以在 HTTP 响应中批准的内容。

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

CSP 允许站点自身 加载来自意外来源的(潜在恶意)内容(例如作为对 XSS 的防御)。

CORS 允许对域放宽 Same Origin Policy

例如通常,如果用户同时登录 example.comexample.org,同源策略会阻止 example.comexample.org/current_user/full_user_details 发出 AJAX 请求并获得对响应的访问权限.

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

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

另一方面,CSP 制定了当前站点上可以 运行 哪些内容的政策。例如,如果 JavaScript 可以内联执行,或者可以从哪些域 .js 加载文件。这可以作为针对 XSS attacks, where the attacker will try and inject script into the HTML page. Normally output would be encoded 的另一道防线是有益的,但是假设开发人员只忘记了一个输出字段。由于该策略阻止了内联脚本的执行,因此攻击被阻止。

CORS 与第三方核实以获取使用其服务的授权。因此,第三方提供或拒绝授权。

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

CSP 通过指定可以从何处加载特定类型的内容来防止网页无意中加载来自第三方的恶意内容。因此,例如,您可以使用指令

为以下每个脚本、css、媒体等提供有效来源

示例:

内容安全策略:默认源'none';脚本源'self'www.google-analytics.comajax.googleapis.com;连接源'self'; img-src 'self';样式源 'self';

更新:@JodySowald 的评论,我觉得更简洁:

Content-Security-Policy prevents calls to external resources and Cross-Origin-Resource-Sharing prevents calls from external sources. To provide an example. For abc.com to show def.net in an iframe, abc.com must not block def.net with its CSP settings and def.net must not block abc.com with its CORS settings.


原回答:

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

假设我们有 abc.com 网站想要向 def.net 发送请求。

  1. 当用户在浏览器中访问 abc.com 时,abc.com 服务器 returns abc.com HTTP 响应,此响应中的 CSP 限制可以防止浏览器中的abc.com向def.net.
  2. 发出请求
  3. 如果在 abc.com HTTP 响应 中没有 CSP 限制,那么 abc.com 在浏览器 中可以发送对 def.net.
  4. 的请求
  5. 收到请求后,def.net 服务器以 [​​=21=]def.net HTTP 响应 响应,此响应中的 CORS 限制可以防止 abc.com 在浏览器中 从加载它。 (注意默认同源策略会限制响应加载,除非CORS另有规定)

所以 CSP 保护 abc.com 而同源策略(缺少 CORS)保护 def.net在上面的例子中。