内容安全策略( CSP )

内容安全策略   (CSP) 是一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括跨站脚本 (XSS) 和数据注入攻击等。无论是数据盗取、网站内容污染还是散发恶意软件,这些攻击都是主要的手段。

内容源

大多数策略指令需要一个或多个内容源。内容源是一串表明内容可能从哪里加载的字符串。

源列表

源列表是一个字符串,指定了一个或多个互联网主机(通过主机名或 IP 地址),和可选的 URL 协议和/或端口号。站点地址可以包含可选的通配符前缀 (星号, '*'),端口号也可以使用通配符 (同样是 '*') 来表明所有合法端口都是有效来源。主机通过空格分隔。

有效的主机表达式包括:

http://*.foo.com
匹配所有使用  http: 协议加载 foo.com 任何子域名的尝试。
mail.foo.com:443
匹配所有访问 mail.foo.com 的 443 端口 的尝试。
https://store.foo.com
匹配所有使用  https: 协议访问 store.foo.com 的尝试。

如果端口号没有被指定,浏览器会使用指定协议的默认端口号。如果协议没有被指定,浏览器会使用访问该文档时的协议。

关键字

有一些关键字可以用来描述某类特别的内容源。它们是:

'none'
代表空集;即不匹配任何 URL。两侧单引号是必须的。
'self'
代表和文档同源,包括相同的 URL 协议和端口号。两侧单引号是必须的。
'unsafe-inline'
允许使用内联资源,如内联的  <script> 元素、 javascript: URL、内联的事件处理函数和内联的  <style> 元素。两侧单引号是必须的。
'unsafe-eval'
允许使用  eval() 等通过字符串创建代码的方法。两侧单引号是必须的。
注意: 使用 'unsafe-inline' 和 'unsafe-eval' 都是不安全的,它们会使您的网站有跨站脚本攻击风险。

例如,您可以指定内容能从文档源和 trustedscripts.foo.com 加载:

Content-Security-Policy: default-src 'self' trustedscripts.foo.com

数据

注意:  data: URI 是不安全的,如果它们被允许成为脚本来源,则会使您的网站有跨站脚本攻击风险。
data:
允许  data: URI 作为内容来源。这是不安全的,因为攻击者可以精心构造 data: URI 来攻击。请谨慎地使用这个源,并确保不要用于脚本。
mediastream:
允许  mediastream: URI 作为内容源。
Content-Security-Policy: default-src 'self'; img-src 'self' data:; media-src mediastream:

CSP 被设计成完全向后兼容(除CSP2 在向后兼容有明确提及的不一致;  更多细节查看这里 章节1.1)。不支持CSP的浏览器也能与实现了CSP的服务器正常合作,反之亦然:不支持 CSP 的浏览器只会忽略它,如常运行,默认为网页内容使用标准的同源策略。如果网站不提供 CSP 头部,浏览器也使用标准的同源策略

为使CSP可用, 你需要配置你的网络服务器返回  Content-Security-Policy  HTTP头部 ( 有时你会看到一些关于X-Content-Security-Policy头部的提法, 那是旧版本,你无须再如此指定它)。

除此之外,  <meta>  元素也可以被用来配置该策略, 例如

<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';">

示例:常见用例

这一部分提供了一些常用的安全策略方案示例。

示例 1

一个网站管理者想要所有内容均来自站点的同一个源 (不包括其子域名)

Content-Security-Policy: default-src 'self'

示例 2

一个网站管理者允许内容来自信任的域名及其子域名 (域名不必须与CSP设置所在的域名相同)

Content-Security-Policy: default-src 'self' *.trusted.com

示例 3

一个网站管理者允许网页应用的用户在他们自己的内容中包含来自任何源的图片, 但是限制音频或视频需从信任的资源提供者(获得),所有脚本必须从特定主机服务器获取可信的代码.

Content-Security-Policy: default-src 'self'; img-src *; media-src media1.com media2.com; script-src userscripts.example.com

在这里,各种内容默认仅允许从文档所在的源获取, 但存在如下例外:

  • 图片可以从任何地方加载(注意 "*" 通配符)。
  • 多媒体文件仅允许从 media1.com 和 media2.com 加载(不允许从这些站点的子域名)。
  • 可运行脚本仅允许来自于userscripts.example.com。

示例 4

一个线上银行网站的管理者想要确保网站的所有内容都要通过SSL方式获取,以避免攻击者窃听用户发出的请求。

Content-Security-Policy: default-src https://onlinebanking.jumbobank.com

该服务器仅允许通过HTTPS方式并仅从onlinebanking.jumbobank.com域名来访问文档。

示例 5

 一个在线邮箱的管理者想要允许在邮件里包含HTML,同样图片允许从任何地方加载,但不允许JavaScript或者其他潜在的危险内容(从任意位置加载)。

Content-Security-Policy: default-src 'self' *.mailsite.com; img-src *

 注意这个示例并未指定script-src。在此CSP示例中,站点通过 default-src 指令的对其进行配置,这也同样意味着脚本文件仅允许从原始服务器获取。

浏览器兼容性

 DesktopMobile
 ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidEdge MobileFirefox for AndroidOpera for AndroidiOS SafariSamsung Internet
Content-Security-PolicyFull support25
Notes
打开
Full support14Full support23
Notes
打开
Full support10
Notes
打开
Full support15Full support7
Notes
打开
Full supportYesFull supportYesFull supportYesFull support23?Full support7.1
Notes
打开
Full supportYes
base-uriFull support40No supportNoFull support35No supportNoFull support27Full support10Full supportYesFull supportYesNo supportNoFull support35?Full support9.3Full supportYes
block-all-mixed-contentFull supportYes?Full support48No supportNoFull supportYes?Full supportYesFull supportYes?Full support48??Full supportYes
child-src
Deprecated
Full support40Full support15Full support45No supportNoFull support27Full support10Full supportYesFull supportYesNo supportNoFull support45?Full support9.3Full supportYes
connect-srcFull support25Full support14Full support23
Notes
打开
No supportNoFull support15Full support7Full supportYesFull supportYes?Full support23?Full support7.1Full supportYes
default-srcFull support25Full support14Full support23No supportNoFull support15Full support7Full supportYesFull supportYes?Full support23?Full support7.1Full supportYes
disown-opener
Experimental
No supportNoNo supportNoNo supportNoNo supportNoNo supportNoNo supportNoNo supportNoNo supportNoNo supportNoNo supportNoNo supportNoNo supportNoNo supportNo
font-srcFull support25Full support14Full support23No supportNoFull support15Full support7Full supportYesFull supportYes?Full support23?Full support7.1Full supportYes
form-actionFull support40Full support15Full support36No supportNoFull support27Full support10Full supportYesFull supportYesNo supportNoFull support36?Full support9.3Full supportYes
frame-ancestorsFull support40Full support15Full support33
Notes
打开
No supportNoFull support26Full support10?Full supportYesNo supportNoFull support33
Notes
打开
?Full support9.3Full supportYes
frame-srcFull support25Full support14Full support23No supportNoFull support15Full support7Full supportYesFull supportYes?Full support23?Full support7.1Full supportYes
img-srcFull support25Full support14Full support23No supportNoFull support15Full support7Full supportYesFull supportYes?Full support23?Full support7.1Full supportYes
manifest-srcFull supportYesNo supportNoFull support41No supportNoFull supportYesNo supportNoFull supportYesFull supportYesNo supportNoFull support41?No supportNoFull supportYes
media-srcFull support25Full support14Full support23No supportNoFull support15Full support7Full supportYesFull supportYes?Full support23?Full support7.1Full supportYes
navigation-to
Experimental
No supportNoNo supportNoNo supportNoNo supportNoNo supportNoNo supportNoNo supportNoNo supportNoNo supportNoNo supportNoNo supportNoNo supportNoNo supportNo
object-srcFull support25Full support14Full support23No supportNoFull support15Full support7Full supportYesFull supportYes?Full support23?Full support7.1Full supportYes
plugin-typesFull support40Full support15No supportNo
Notes
打开
No supportNoFull support27Full support10Full supportYesFull supportYesNo supportNoNo supportNo?Full support9.3Full supportYes
referrer
Deprecated Non-standard
No support33 — 56No supportNoFull support37
Notes
打开
No supportNoNo support? — 43No supportNoNo support33 — 56No support33 — 56No supportNoFull support37
Notes
打开
No support? — 43No supportNoFull supportYes
report-sample
Experimental
Full support59???Full support46?Full support59Full support59??Full support46?Full support7.0
report-toNo supportNoNo supportNoNo supportNoNo supportNoNo supportNoNo supportNoNo supportNoNo supportNoNo supportNoNo supportNoNo supportNoNo supportNoNo supportNo
report-uri
Deprecated
Full support25Full support14Full support23No supportNoFull support15Full support7Full supportYesFull supportYes?Full support23?Full support7.1Full supportYes
require-sri-for
Experimental
Full support54No supportNoFull support49
Disabled
打开
No supportNoFull support41No supportNoFull support54Full support54No supportNoFull support49
Disabled
打开
Full support41No supportNoFull support6.0
sandboxFull support25Full support14Full support50Full support10Full support15Full support7Full supportYesFull supportYes?Full support50?Full support7.1Full supportYes
script-srcFull support25Full support14Full support23No supportNoFull support15Full support7Full supportYesFull supportYes?Full support23?Full support7.1Full supportYes
strict-dynamicFull support52No supportNoFull support52No supportNoFull support39No supportNoFull support52Full support52No supportNoNo supportNoFull support39No supportNoFull support6.0
style-srcFull support25Full support14Full support23No supportNoFull support15Full support7Full supportYesFull supportYes?Full support23?Full support7.1Full supportYes
upgrade-insecure-requestsFull support43No supportNo
Notes
打开
Full support42No supportNoFull support30No supportNoFull support43Full support43No supportNoFull support42Full support30No supportNoFull support4.0
worker-srcFull support59
Notes
打开
No supportNoFull support58No supportNoFull support48No supportNoFull support59
Notes
打开
Full support59
Notes
打开
No supportNoFull support58Full support48No supportNoFull support7.0


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值