HTTP 响应头Content-Security-Policy

贲凌
2023-12-01

HTTP 响应头Content-Security-Policy允许站点管理者控制用户代理能够为指定的页面加载哪些资源。

除了少数例外情况,设置的政策主要涉及指定服务器的源和脚本结束点。

这将防止跨站脚本攻击(Cross-Site Script)

更多信息,查看https://blog.csdn.net/realmardrid/article/details/108205602

禁止修改的消息首部指的是不能在代码中通过编程的方式进行修改的http协议消息首部。

本文仅讨论相关的HTTP请求首部(关于禁止修改的响应首部,请参考Set-Cookie或 Set-Cookie2)。

用户代理对这些消息首部保留全部控制权,应用程序无法设置它们。

Names starting with `Sec-` are reserved for creating new headers safe from apis using Fetch that grant developers control over headers, such as XMLHttpRequest

禁止修改的消息首部包括以 Proxy- 和 Sec- 开头的消息首部,以及下面列出的消息首部:

  • Accept-Charset
  • Accept-Encoding
  • Access-Control-Request-Headers
  • Access-Control-Request-Method
  • Connection
  • Content-Length
  • Cookie
  • Cookie2
  • Date
  • DNT
  • Expect
  • Host
  • Keep-Alive
  • Origin
  • Proxy-
  • Sec-
  • Referer
  • TE
  • Trailer
  • Transfer-Encoding
  • Upgrade
  • Via

语法

Content-Security-Policy: <policy-directive>; <policy-directive>

指令

获取指令:Fetch directives

通过获取指令来控制某些可能被加载的确切的资源类型的位置。

child-src

child-src:为 web workers和其他内嵌浏览器内容(例如用<frame>和<iframe>加载到页面的内容)定义合法的源地址。

如果开发者希望管控内嵌浏览器内容和 web worker 应分别使用frame-src和worker-src 指令,来相对的取代 child-src

connect-src

connect-src:限制能通过脚本接口加载的URL。

default-src

default-src:为其他取指令提供备用服务fetch directives。

font-src

font-src:设置允许通过@font-face加载的字体源地址。

frame-src

frame-src: 设置允许通过类似<frame>和<iframe>标签加载的内嵌内容的源地址。

img-src

img-src: 限制图片和图标的源地址

manifest-src

manifest-src : 限制应用声明文件的源地址。

media-src

media-src:限制通过<audio>、<video>或<track>标签加载的媒体文件的源地址。

object-src

object-src:限制<object>、<embed>、<applet>标签的源地址。

object-src控制的元素可能碰巧被当作遗留HTML元素,导致不支持新标准中的功能(例如<iframe>中的安全属性sandboxallow)。因此建议限制该指令的使用(比如,如果可行,将object-src显式设置为'none')。

prefetch-src

指定预加载或预渲染的允许源地址。

script-src

限制JavaScript的源地址。

style-src

限制层叠样式表文件源。

webrtc-src 

指定WebRTC连接的合法源地址。

worker-src

限制Worker、SharedWorker或者ServiceWorker脚本源。

文档指令 | Document directives

文档指令管理文档属性或者worker环境应用的策略。

base-uri

限制在DOM中<base>元素可以使用的URL。

plugin-types

通过限制可以加载的资源类型来限制哪些插件可以被嵌入到文档中。

sandbox

类似<iframe> sandbox属性,为请求的资源启用沙盒。

disown-opener

确保资源在导航的时候能够脱离父页面。(windown.opener 对象)Ensures a resource will disown its opener when navigated to.

导航指令 | Navigation directives

导航指令管理用户能打开的链接或者表单可提交的链接

form-action

限制能被用来作为给定上下文的表单提交的目标 URL(说白了,就是限制 form 的 action 属性的链接地址)

frame-ancestors

指定可能嵌入页面的有效父项<frame>, <iframe>, <object>, <embed>, or <applet>.

navigation-to

限制文档可以通过以下任何方式访问URL (a, form, window.location, window.open, etc.)

报告指令

报告指令控制 CSP 违规的报告过程. 更多请看 Content-Security-Policy-Report-Only报头.

report-uri

当出现可能违反CSP的操作时,让客户端提交报告。这些违规报告会以JSON文件的格式通过POST请求发送到指定的URI

report-to

Fires a SecurityPolicyViolationEvent.

其他指令 | Other directives

block-all-mixed-content

当使用HTTPS加载页面时阻止使用HTTP加载任何资源。

referrer

用来指定会离开当前页面的跳转链接的 referer header 信息。应该使用 Referrer-Policy替代。

require-sri-for

需要使用 SRI 作用于页面上的脚本或样式。

upgrade-insecure-requests

让浏览器把一个网站所有的不安全 URL(通过 HTTP 访问)当做已经被安全的 URL 链接(通过 HTTPS 访问)替代。这个指令是为了哪些有量大不安全的传统 URL 需要被重写时候准备的。

CSP 和 Workers

Workers 一般来说不被创建他的文档(或者父级Worker)的CSP策略管理。如果要为Worker指定CSP策略,可以为Worker脚本的请求的响应的头部设置CSP策略。 

例外的情况是,如果Worker脚本的来源是一个全局唯一ID(比如,它的URL是一个结构化的数据或者BLOB)。在这种情况下,这个Worker会继承它所属的文档或者创建它的Worker的CSP策略。

多内容安全策略

CSP 允许在一个资源中指定多个策略, 包括通过 Content-Security-Policy 头, 以及Content-Security-Policy-Report-Only 头,和 <meta> 组件。

你可以像以下实例一样多次调用 Content-Security-Policy 头。 特别注意这里的connect-src 指令。 尽管第二个策略允许连接, 第一个策略仍然包括了 connect-src 'none'。添加了附加的策略后,只会让资源保护的能力更强,也就是说不会有接口可以被允许访问,等同于最严格的策略,connect-src 'none' 强制开启。

Content-Security-Policy: default-src 'self' http://example.com;
                         connect-src 'none';
Content-Security-Policy: connect-src http://example.com/;
                         script-src http://example.com/

示例

示例: 禁用不安全的内联/动态执行, 只允许通过 https加载这些资源 (images, fonts, scripts, etc.)

// header
Content-Security-Policy: default-src https:

// meta tag
<meta http-equiv="Content-Security-Policy" content="default-src https:">

示例: 已经存在的一个网站,用了太多内联代码修复问题,而且想确保资源只从 https 加载,并且禁止插件:

Content-Security-Policy: default-src https: 'unsafe-eval' 'unsafe-inline'; object-src 'none'

实例:还没有开始实施上面的策略;相反,只是开始上报可能会发生违反安全策略的行为:

Content-Security-Policy-Report-Only: default-src https:; report-uri /csp-violation-report-endpoint/

查看 Mozilla Web Security Guidelines 上的更多例子.

规范

规范状态注释
Content Security Policy Level 3Working DraftAdds disown-openermanifest-srcnavigation-toreport-uristrict-dynamicworker-src. Undeprecates frame-src. Deprecates report-uri in favor if report-to.
Mixed ContentCandidate RecommendationAdds block-all-mixed-content.
Subresource IntegrityRecommendationAdds require-sri-for.
Upgrade Insecure RequestsCandidate RecommendationAdds upgrade-insecure-requests.
Content Security Policy Level 2RecommendationAdds base-urichild-srcform-actionframe-ancestorsplugin-typesreferrerreflected-xss, and report-uri. Deprecates frame-src.
Content Security Policy 1.0ObsoleteDefines connect-srcdefault-srcfont-srcframe-srcimg-srcmedia-srcobject-src, report-uri, sandboxscript-src, and style-src.

浏览器兼容性

No compatibility data found. Please contribute data for "http/headers/content-security-policy" (depth: Content-Security-Policy) to the MDN compatibility data repository.

参见

 类似资料: