Content-Security-Policy
Content-Security-Policy 允许站点管理者控制用户代理能够为指定的页面加载哪些资源。除了少数例外情况,设置的政策主要涉及指定服务器的源和脚本结束点。这将帮助防止跨站脚本攻击(Cross-Site Script)(XSS (en-US))。
如需更多信息,请查阅Content Security Policy (CSP)。
| 头部类型 | Response header | 
|---|---|
| Forbidden header name | no | 
语法
Content-Security-Policy: <policy-directive>; <policy-directive>
指令
获取指令:Fetch directives
通过获取指令来控制某些可能被加载的确切的资源类型的位置。
child-src- 
    
child-src:为 Web Workers 和其他内嵌浏览器内容(例如用
<frame>和<iframe>加载到页面的内容)定义合法的源地址。警告: 如果开发者希望管控内嵌浏览器内容和 web worker 应分别使用
frame-src(en-US) 和worker-src指令,来相对的取代child-src。 connect-src- 
    
connect-src:限制能通过脚本接口加载的 URL。
 default-src- 
    
default-src:为其他取指令提供备用服务 fetch directives。
 font-src- 
    
font-src:设置允许通过
@font-face加载的字体源地址。 frame-src(en-US)img-src(en-US)- 
    
img-src:限制图片和图标的源地址。
 manifest-src(en-US)- 
    
manifest-src:限制应用声明文件的源地址。
 media-src(en-US)object-src(en-US)
备注: 被 object-src 控制的元素可能碰巧被当作遗留 HTML 元素,导致不支持新标准中的功能(例如 <iframe> 中的安全属性 sandbox 和 allow)。因此建议限制该指令的使用(比如,如果可行,将 object-src 显式设置为 'none')。
prefetch-src(en-US)- 
    
指定预加载或预渲染的允许源地址。
 script-src(en-US)- 
    
限制 JavaScript 的源地址。
 style-src(en-US)- 
    
限制层叠样式表文件源。
 webrtc-src实验性- 
    
指定WebRTC连接的合法源地址。
 worker-src- 
    
限制
Worker、SharedWorker或ServiceWorker脚本源。 
文档指令 | Document directives
文档指令管理文档属性或者 worker 环境应用的策略。
base-uri- 
    
限制在 DOM 中
<base>元素可以使用的 URL。 plugin-types(en-US)- 
    
通过限制可以加载的资源类型来限制哪些插件可以被嵌入到文档中。
 sandboxdisown-opener已弃用- 
    
确保资源在导航的时候能够脱离父页面。(windown.opener 对象)Ensures a resource will disown its opener when navigated to.
 
导航指令
导航指令管理用户能打开的链接或者表单可提交的链接
form-action- 
    
限制能被用来作为给定上下文的表单提交的目标 URL(说白了,就是限制 form 的 action 属性的链接地址)
 frame-ancestors- 
    
限制文档可以通过以下任何方式访问 URL,包括
<form>(如果未指定form-action)、<a>、window.location、window.open等。 
报告指令
报告指令控制 CSP 违规的报告过程。更多请看 Content-Security-Policy-Report-Only 报头。
report-uri(en-US) 已弃用- 
    
当出现可能违反 CSP 的操作时,让客户端提交报告。这些违规报告会以 JSON 文件的格式通过 POST 请求发送到指定的 URI
 report-to实验性- 
    
Fires a
SecurityPolicyViolationEvent. 
其他指令 | Other directives
block-all-mixed-content- 
    
当使用 HTTPS 加载页面时阻止使用 HTTP 加载任何资源。
 referrer(en-US) 已弃用- 
    
用来指定会离开当前页面的跳转链接的 referer header 信息。应该使用
Referrer-Policy替代。 require-sri-for- 
    
需要使用 SRI (en-US) 作用于页面上的脚本或样式。
 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 加载这些资源(如图片、字体、脚本等):
// 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 上的更多例子。
规范
| Specification | 
|---|
| Content Security Policy Level 3  # csp-header  | 
浏览器兼容性
BCD tables only load in the browser