在响应非HTML请求时设置内容安全策略是什么意思?

lor*_*ron 5 html javascript ajax content-security-policy

我了解我可能会在网站主页上设置CSP标头https://example.com,以限制从何处加载脚本和其他资源。但是,如果主页上没有CSP,浏览器将如何处理后续请求的策略?

这是两个示例合二为一:

  1. 我浏览https://example.com并获取一些HTML(没有CSP标头)
  2. HTML包含https://example.com/script.js[*]中的脚本
  3. 该脚本通过向https://api.example.com[*] 发出GET来从API请求一些数据
  4. 然后,相同的脚本将Websocket打开到相同的域, https://api.example.com
  5. 然后,同一脚本发出另一个请求,从外部发布到 https://api.analytics.com

[*]在步骤2和3中,如果script.js或JSON响应返回了带有限制的CSP,会发生什么Content-Security-Policy: default-src 'none'?下游要求会改变吗?浏览器是否采取任何措施来阻止脚本的任何请求?还是因为原始页面加载不包含任何CSP而被允许?

谢谢!

aps*_*ers 17

当前的CSP规范(第2版)说(重点煤矿):

3.6. 政策适用性

策略与受保护的资源相关联,并针对该资源实施或监控。如果资源没有创建新的执行上下文(例如,将脚本、图像或样式表包含到文档中时),则随该资源交付的任何策略都将被丢弃而不会生效。它的执行取决于包含上下文的策略。

CSP 仅适用于创建新执行上下文(即网页)的资源,其中仅包括顶级文档、嵌入对象(如<iframe>s)和作为 Web Workers 加载的脚本。如果资源是通过 HTTP 提供的,并且该资源没有以创建新执行上下文的方式使用,则 CSP 无效。

因此,无论是否带有Content-Security-Policy标头,您的脚本的行为都相同。

  • 是的,但一般来说 json 响应可以作为顶级文档呈现。目前,我只是将 CSP 添加到每个响应中,但这是否太过分了?它应该以某种方式基于内容类型吗?仅文本/html、应用程序/pdf 等? (2认同)