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
|
---
title: 'CSP: default-src'
slug: Web/HTTP/Headers/Content-Security-Policy/default-src
tags:
- 内容安全策略
- 安全
- 超文本传输协议
translation_of: Web/HTTP/Headers/Content-Security-Policy/default-src
---
<div>{{HTTPSidebar}}</div>
<p>在 HTTP 协议中,{{HTTPHeader("Content-Security-Policy")}} (CSP) 首部字段中的 <code><strong>default</strong></code><strong><code>-src</code></strong> 指令可以为其他 CSP 拉取指令({{Glossary("fetch directive", "fetch directives")}})提供备选项。对于以下列出的指令,假如不存在的话,那么用户代理会查找并应用 default-src 指令的值。</p>
<ul>
<li>{{CSP("child-src")}}</li>
<li>{{CSP("connect-src")}}</li>
<li>{{CSP("font-src")}}</li>
<li>{{CSP("frame-src")}}</li>
<li>{{CSP("img-src")}}</li>
<li>{{CSP("manifest-src")}}</li>
<li>{{CSP("media-src")}}</li>
<li>{{CSP("object-src")}}</li>
<li>{{CSP("script-src")}}</li>
<li>{{CSP("style-src")}}</li>
<li>{{CSP("worker-src")}}</li>
</ul>
<table class="properties">
<tbody>
<tr>
<th scope="row">CSP 版本</th>
<td>1</td>
</tr>
<tr>
<th scope="row">指令类型</th>
<td>{{Glossary("Fetch directive")}}</td>
</tr>
</tbody>
</table>
<h2 id="语法">语法</h2>
<p><code>default-src</code> 策略允许指定一个或多个源:</p>
<pre class="syntaxbox">Content-Security-Policy: default-src <source>;
Content-Security-Policy: default-src <source> <source>;
</pre>
<h3 id="源">源</h3>
<p><source> 可以是以下之一:</p>
<dl>
<dt><host-source></dt>
<dd>以域名或者 IP 地址表示的主机名,外加可选的 URL 协议名(<a href="/en-US/docs/URIs_and_URLs">URL scheme</a>)以及端口号。站点地址中可能会包含一个可选的前置通配符(星号 '*'),同时也可以将通配符(也是'*')应用于端口号,表示在这个源中可以使用任意合法的端口号。<br>
举例说明:
<ul>
<li><code>http://*.example.com:</code> 匹配从使用 http: 的 example.com 的任意子域的资源加载。</li>
<li><code>mail.example.com:443:</code>匹配对 mail.example.com 上的 443 端口号的访问。</li>
<li><code>https://store.example.com</code>: 匹配对使用了 https: 的 store.example.com 的访问。</li>
</ul>
</dd>
<dt><scheme-source></dt>
<dd>协议名如'http:' 或者 'https:'。<strong>必须带有冒号,不要有单引号</strong>。同时你还可以指定数据协议(data schema)(不推荐使用)。
<ul>
<li><code>data:</code> 允许 <a href="/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs"><code>data:</code> URIs</a> 作为内容的源<em>。这是不安全的。攻击者可以注入任意 data: URI 。不要轻易使用这种形式的源,尤其是脚本,绝对不要使用。</em></li>
<li><code>mediastream:</code> 允许 <a href="/en-US/docs/Web/API/MediaStream_API"><code>mediastream:</code> URIs</a> 作为内容的源<em>。</em></li>
<li><code>blob:</code> 允许 <a href="/en-US/docs/Web/API/Blob"><code>blob:</code> URIs</a> 作为内容的源<em>。</em></li>
<li><code>filesystem:</code> 允许 <a href="/en-US/docs/Web/API/FileSystem"><code>filesystem:</code> URIs</a> 作为内容的源<em>。</em></li>
</ul>
</dd>
<dt><code>'self'</code></dt>
<dd>指向与要保护的文件所在的源,包括相同的 URL scheme 与端口号。必须有单引号。一些浏览器会特意排除 blob 与 filesystem 。需要设定这两种内容类型的站点可以在 Data 属性中进行设定。</dd>
<dt><code>'unsafe-inline'</code></dt>
<dd>允许使用内联资源,例如内联 {{HTMLElement("script")}} 元素(javascript: URL)、内联事件处理器以及内联 {{HTMLElement("style")}} 元素。必须有单引号。</dd>
<dt><code>'unsafe-eval'</code></dt>
<dd>允许使用 eval() 以及相似的函数来从字符串创建代码。必须有单引号。</dd>
<dt><code>'none'</code></dt>
<dd>不允许任何内容。 必须有单引号。</dd>
<dt>'nonce-<base64值>'</dt>
<dd>特定使用一次性加密内联脚本的白名单。服务器必须在每一次传输政策时生成唯一的一次性值。否则将存在绕过资源政策的可能。请参见<a href="/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src#Unsafe_inline_script">不安全的内联脚本</a>查看示例。</dd>
<dt><hash-source></dt>
<dd>使用 sha256、sha384 或 sha512 编码过的内联脚本或样式。其由用短划线分隔的两部分组成: 用于创建哈希的加密算法, 以及脚本或样式base64编码的哈希值。当生成哈希值的时候,不要包含 <script> 或 <style> 标签,同时注意字母大小写与空格——包括首尾空格——都是会影响生成的结果的。请参见<a href="/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src#Unsafe_inline_script">不安全的内联脚本</a>。</dd>
<dt>'strict-dynamic'</dt>
<dd>strict-dynamic 指定对于含有标记脚本(通过附加一个随机数或散列)的信任,应该传播到由该脚本加载的所有脚本。与此同时,任何白名单以及源表达式例如 'self' 或者 'unsafe-inline' 都会被忽略。参见 <a href="/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src#strict-dynamic">script-src</a> 。</dd>
</dl>
<h2 id="示例">示例</h2>
<h3 id="不继承_default-src_的情况"><code><font face="x-locale-heading-primary, zillaslab, Palatino, Palatino Linotype, x-locale-heading-secondary, serif">不继承 </font>default-src 的情况</code></h3>
<p>假如设定了其他指令,那么 <code>default-src</code> 不会对它们起作用。这个首部</p>
<pre class="brush: bash">Content-Security-Policy: default-src 'self'; script-src https://example.com</pre>
<p>与下列代码等价:</p>
<pre class="brush: bash">Content-Security-Policy: connect-src 'self';
font-src 'self';
frame-src 'self';
img-src 'self';
manifest-src 'self';
media-src 'self';
object-src 'self';
script-src https://example.com;
style-src 'self';
worker-src 'self'</pre>
<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", "#directive-default-src", "default-src")}}</td>
<td>{{Spec2('CSP 3.0')}}</td>
<td>Added <code>frame-src</code>, <code>manifest-src</code> and <code>worker-src</code> as defaults.</td>
</tr>
<tr>
<td>{{specName("CSP 1.1", "#directive-default-src", "default-src")}}</td>
<td>{{Spec2('CSP 1.1')}}</td>
<td>Initial definition.</td>
</tr>
</tbody>
</table>
<h2 id="浏览器兼容性">浏览器兼容性</h2>
<p class="hidden">此页中的兼容性表格从已构建的数据中生成。若您想贡献数据,请前往<a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a>并向我们发送Pull request。</p>
<p>{{Compat("http.headers.csp.default-src")}}</p>
<h2 id="另请参阅">另请参阅</h2>
<ul>
<li>{{HTTPHeader("Content-Security-Policy")}}</li>
<li>{{CSP("connect-src")}}</li>
<li>{{CSP("font-src")}}</li>
<li>{{CSP("frame-src")}}</li>
<li>{{CSP("img-src")}}</li>
<li>{{CSP("manifest-src")}}</li>
<li>{{CSP("media-src")}}</li>
<li>{{CSP("object-src")}}</li>
<li>{{CSP("script-src")}}</li>
<li>{{CSP("style-src")}}</li>
<li>{{CSP("worker-src")}}</li>
</ul>
|