Content-Security-Policy
=======================

HTTP 响应头 **`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)

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

`img-src` (en-US)

**img-src**：限制图片和图标的源地址。

`manifest-src` (en-US)

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

`media-src` (en-US)

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

`object-src` (en-US)

**object-src**：限制 `<object>` 或 `<embed>` 标签的源地址。


**备注：** 被 `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)

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

`sandbox`

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

`disown-opener` 
已弃用

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

### 导航指令

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

`form-action`

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

`frame-ancestors`

指定可能嵌入页面的有效父项 `<frame>`、`<iframe>`、`<object>` 或 `<embed>`。

`navigation-to` 
实验性

限制文档可以通过以下任何方式访问 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 with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `Content-Security-Policy-Report-Only`
* Content Security in WebExtensions
* Display security and privacy policies In Firefox Developer Tools