aboutsummaryrefslogtreecommitdiff
path: root/files/zh-cn/web/http/headers/content-security-policy/index.html
blob: 391086d5a626bf6366f7c809c32fef29405748ea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
---
title: Content-Security-Policy
slug: Web/HTTP/Headers/Content-Security-Policy
translation_of: Web/HTTP/Headers/Content-Security-Policy
---
<div>{{HTTPSidebar}}</div>

<div>HTTP 响应头<strong><code>Content-Security-Policy</code></strong>允许站点管理者控制用户代理能够为指定的页面加载哪些资源。除了少数例外情况,设置的政策主要涉及指定服务器的源和脚本结束点。这将帮助防止跨站脚本攻击(<code>Cross-Site Script</code>)({{Glossary("XSS")}})。</div>

<p>如需更多信息,请查阅<a href="/en-US/docs/Web/HTTP/CSP">Content Security Policy (CSP)</a></p>

<table class="properties">
 <tbody>
  <tr>
   <th scope="row">头部类型</th>
   <td>{{Glossary("Response header")}}</td>
  </tr>
  <tr>
   <th scope="row">{{Glossary("Forbidden header name")}}</th>
   <td>no</td>
  </tr>
 </tbody>
</table>

<h2 id="语法">语法</h2>

<pre class="syntaxbox">Content-Security-Policy: &lt;policy-directive&gt;; &lt;policy-directive&gt;
</pre>

<h2 id="指令">指令</h2>

<h3 id="获取指令:GlossaryFetch_directive_Fetch_directives">获取指令:{{Glossary("Fetch directive", "Fetch directives")}}</h3>

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

<dl>
 <dt>{{CSP("child-src")}}</dt>
 <dd><strong>child-src:</strong><a href="/zh-CN/docs/Web/API/Web_Workers_API">web workers</a> 和其他内嵌浏览器内容(例如用{{HTMLElement("frame")}}{{HTMLElement("iframe")}}加载到页面的内容)定义合法的源地址。</dd>
 <dt>
 <div class="warning">
 <p>如果开发者希望管控内嵌浏览器内容和 web worker 应分别使用{{CSP("frame-src")}}{{CSP("worker-src")}} 指令,来相对的取代 <code><strong>child-src</strong></code></p>
 </div>
 </dt>
 <dt></dt>
 <dt>{{CSP("connect-src")}}</dt>
 <dd><strong>connect-src:</strong>限制能通过脚本接口加载的URL。</dd>
 <dt>{{CSP("default-src")}}</dt>
 <dd><strong>default-src:</strong>为其他取指令提供备用服务{{Glossary("Fetch directive", "fetch directives")}}</dd>
 <dt>{{CSP("font-src")}}</dt>
 <dd><strong>font-src:</strong>设置允许通过{{cssxref("@font-face")}}加载的字体源地址。</dd>
 <dt>{{CSP("frame-src")}}</dt>
 <dd><strong>frame-src: </strong>设置允许通过类似{{HTMLElement("frame")}}{{HTMLElement("iframe")}}标签加载的内嵌内容的源地址。</dd>
 <dt>{{CSP("img-src")}}</dt>
 <dd><strong>img-src: </strong>限制图片和图标的源地址</dd>
 <dt>{{CSP("manifest-src")}}</dt>
 <dd><strong>manifest-src : </strong>限制应用声明文件的源地址。</dd>
 <dt>{{CSP("media-src")}}</dt>
 <dd><strong>media-src:</strong>限制通过{{HTMLElement("audio")}}{{HTMLElement("video")}}{{HTMLElement("track")}}标签加载的媒体文件的源地址。</dd>
 <dt>{{CSP("object-src")}}</dt>
 <dd><strong>object-src:</strong>限制{{HTMLElement("object")}}{{HTMLElement("embed")}}{{HTMLElement("applet")}}标签的源地址。</dd>
</dl>

<div class="blockIndicator note">
<p><code>object-src</code>控制的元素可能碰巧被当作遗留HTML元素,导致不支持新标准中的功能(例如<code>&lt;iframe&gt;</code>中的安全属性<code>sandbox</code><code>allow</code>)。因此<strong>建议</strong>限制该指令的使用(比如,如果可行,将<code>object-src</code>显式设置为<code>'none'</code>)。</p>
</div>

<dl>
 <dt>{{CSP("prefetch-src")}} </dt>
 <dd>指定预加载或预渲染的允许源地址。</dd>
 <dt>{{CSP("script-src")}}</dt>
 <dd>限制JavaScript的源地址。</dd>
 <dt>{{CSP("style-src")}}</dt>
 <dd>限制层叠样式表文件源。</dd>
 <dt>{{CSP("webrtc-src")}} {{experimental_inline}}</dt>
 <dd>指定<a href="https://developer.mozilla.org/docs/Web/API/WebRTC_API">WebRTC</a>连接的合法源地址。</dd>
 <dt>{{CSP("worker-src")}}</dt>
 <dd>限制{{domxref("Worker")}}{{domxref("SharedWorker")}}或者{{domxref("ServiceWorker")}}脚本源。</dd>
</dl>

<h3 id="文档指令_Document_directives">文档指令 | Document directives</h3>

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

<dl>
 <dt>{{CSP("base-uri")}}</dt>
 <dd>限制在DOM中{{HTMLElement("base")}}元素可以使用的URL。</dd>
 <dt>{{CSP("plugin-types")}}</dt>
 <dd>通过限制可以加载的资源类型来限制哪些插件可以被嵌入到文档中。</dd>
 <dt>{{CSP("sandbox")}}</dt>
 <dd>类似{{HTMLElement("iframe")}} {{htmlattrxref("sandbox", "iframe")}}属性,为请求的资源启用沙盒。</dd>
 <dt>{{CSP("disown-opener")}} {{obsolete_inline}}</dt>
 <dd>确保资源在导航的时候能够脱离父页面。(windown.opener 对象)Ensures a resource will disown its opener when navigated to.</dd>
</dl>

<h3 id="导航指令_Navigation_directives">导航指令 | Navigation directives</h3>

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

<dl>
 <dt>{{CSP("form-action")}}</dt>
 <dd>限制能被用来作为给定上下文的表单提交的目标 URL(说白了,就是限制 form 的 action 属性的链接地址)</dd>
 <dt>{{CSP("frame-ancestors")}}</dt>
 <dd>指定可能嵌入页面的有效父项{{HTMLElement("frame")}}{{HTMLElement("iframe")}}{{HTMLElement("object")}}{{HTMLElement("embed")}}, or {{HTMLElement("applet")}}.</dd>
 <dt>{{CSP("navigation-to")}} {{experimental_inline}}</dt>
 <dd>限制文档可以通过以下任何方式访问URL (a, form, window.location, window.open, etc.)</dd>
</dl>

<h3 id="报告指令">报告指令</h3>

<p>报告指令控制 CSP 违规的报告过程. 更多请看 {{HTTPHeader("Content-Security-Policy-Report-Only")}} 报头.</p>

<dl>
 <dt>{{CSP("report-uri")}} {{deprecated_inline}}</dt>
 <dd>当出现可能违反CSP的操作时,让客户端提交报告。这些违规报告会以JSON文件的格式通过POST请求发送到指定的URI</dd>
 <dt>{{CSP("report-to")}} {{experimental_inline}}</dt>
 <dd>Fires a <code>SecurityPolicyViolationEvent</code>.</dd>
</dl>

<h3 id="其他指令_Other_directives">其他指令 | Other directives</h3>

<dl>
 <dt>{{CSP("block-all-mixed-content")}}</dt>
 <dd>当使用HTTPS加载页面时阻止使用HTTP加载任何资源。</dd>
 <dt>{{CSP("referrer")}} {{obsolete_inline}}</dt>
 <dd>用来指定会离开当前页面的跳转链接的 referer header 信息。应该使用 {{HTTPHeader("Referrer-Policy")}} 替代。</dd>
 <dt>{{CSP("require-sri-for")}}</dt>
 <dd>需要使用 {{Glossary("SRI")}} 作用于页面上的脚本或样式。</dd>
 <dt>{{CSP("upgrade-insecure-requests")}}</dt>
 <dd>让浏览器把一个网站所有的不安全 URL(通过 HTTP 访问)当做已经被安全的 URL 链接(通过 HTTPS 访问)替代。这个指令是为了哪些有量大不安全的传统 URL 需要被重写时候准备的。</dd>
</dl>

<h2 id="CSP_和_Workers">CSP 和 Workers</h2>

<p><a href="/en-US/docs/Web/API/Worker">Workers</a> 一般来说不被创建他的文档(或者父级Worker)的CSP策略管理。如果要为Worker指定CSP策略,可以为Worker脚本的请求的响应的头部设置CSP策略。 </p>

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

<h2 id="多内容安全策略">多内容安全策略</h2>

<p>CSP 允许在一个资源中指定多个策略, 包括通过 <code>Content-Security-Policy</code> 头, 以及 {{HTTPHeader("Content-Security-Policy-Report-Only")}} 头,和 {{HTMLElement("meta")}} 组件。</p>

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

<pre>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/</pre>

<h2 id="示例">示例</h2>

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

<pre>// header
Content-Security-Policy: default-src https:

// meta tag
&lt;meta http-equiv="Content-Security-Policy" content="default-src https:"&gt;
</pre>

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

<pre>Content-Security-Policy: default-src https: 'unsafe-eval' 'unsafe-inline'; object-src 'none'</pre>

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

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

<p>查看 <a href="https://wiki.mozilla.org/Security/Guidelines/Web_Security#Examples_5">Mozilla Web Security Guidelines</a> 上的更多例子.</p>

<h2 id="规范">规范</h2>

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col">规范</th>
   <th scope="col">状态</th>
   <th scope="col">注释</th>
  </tr>
  <tr>
   <td>{{specName("CSP 3.0")}}</td>
   <td>{{Spec2('CSP 3.0')}}</td>
   <td>Adds <code>disown-opener</code>, <code>manifest-src</code>, <code>navigation-to</code>, <code>report-uri</code>, <code>strict-dynamic</code>, <code>worker-src</code>. Undeprecates <code>frame-src</code>. Deprecates report-uri in favor if <code>report-to</code>.</td>
  </tr>
  <tr>
   <td>{{specName("Mixed Content")}}</td>
   <td>{{Spec2('Mixed Content')}}</td>
   <td>Adds <code>block-all-mixed-content</code>.</td>
  </tr>
  <tr>
   <td>{{specName("Subresource Integrity")}}</td>
   <td>{{Spec2('Subresource Integrity')}}</td>
   <td>Adds <code>require-sri-for</code>.</td>
  </tr>
  <tr>
   <td>{{specName("Upgrade Insecure Requests")}}</td>
   <td>{{Spec2('Upgrade Insecure Requests')}}</td>
   <td>Adds <code>upgrade-insecure-requests</code>.</td>
  </tr>
  <tr>
   <td>{{specName("CSP 1.1")}}</td>
   <td>{{Spec2('CSP 1.1')}}</td>
   <td>Adds <code>base-uri</code>, <code>child-src</code>, <code>form-action</code>, <code>frame-ancestors</code>, <code>plugin-types</code>, <code>referrer</code>, <code>reflected-xss</code>, and <code>report-uri</code>. Deprecates <code>frame-src</code>.</td>
  </tr>
  <tr>
   <td>{{specName("CSP 1.0")}}</td>
   <td>{{Spec2('CSP 1.0')}}</td>
   <td>Defines <code>connect-src</code>, <code>default-src</code>, <code>font-src</code>, <code>frame-src</code>, <code>img-src</code>, <code>media-src</code>, <code>object-src</code>, report-uri, <code>sandbox</code>, <code>script-src,</code> and <code>style-src</code>.</td>
  </tr>
 </tbody>
</table>

<h2 id="浏览器兼容性">浏览器兼容性</h2>

<p class="hidden">The compatibility table in this page is generated from structured data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> and send us a pull request.</p>

<p>{{Compat("http/headers/content-security-policy", "Content-Security-Policy")}}</p>

<h2 id="参见">参见</h2>

<ul>
 <li>{{HTTPHeader("Content-Security-Policy-Report-Only")}}</li>
 <li><a href="/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_Security_Policy">Content Security in WebExtensions</a></li>
 <li>
  <p><a href="/en-US/docs/Tools/GCLI/Display_security_and_privacy_policies">Display security and privacy policies In Firefox Developer Tools</a></p>
 </li>
</ul>