内容安全策略(CSP)是一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括跨站脚本(XSS)和数据注入攻击等。无论是数据盗取、网站内容污染还是恶意软件分发,这些攻击都是主要的手段。
缓解跨站脚本攻击
CSP 的主要目标是减少和报告 XSS 攻击。XSS 攻击利用了浏览器对于从服务器所获取的内容的信任。恶意脚本在受害者的浏览器中得以运行,因为浏览器信任其内容来源,即使有的时候这些脚本并非来自于它本该来的地方。
CSP 通过指定有效域——即浏览器认可的可执行脚本的有效来源——使服务器管理者有能力减少或消除 XSS 攻击所依赖的载体。一个 CSP 兼容的浏览器将会仅执行从白名单域获取到的脚本文件,忽略所有的其他脚本(包括内联脚本和 HTML 的事件处理属性)。
作为一种终极防护形式,始终不允许执行脚本的站点可以选择全面禁止脚本执行。
该安全策略的实现基于一个叫做 Content-Security-Policy 的 HTTP 首部。除此之外, 元素也可以被用来配置该策略,例如:
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self'; img-src https://*; child-src 'none';" />
你可以使用 Content-Security-Policy HTTP 标头来指定你的策略,像这样:
Content-Security-Policy: policy
policy 表示策略,是一个包含了各种描述你的 CSP 策略指令的字符串。对于不同类型的项目都有特定的指令,因此每种类型都可以有自己的指令,包括字体、frame、图像、音频和视频媒体、script 和 worker。比如我们要限制图片的加载需要用 img-src,限制多媒体文件的加载需要用 media-src,限制脚本的加载需要用 script-src,举个例子:
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
具体有哪些指令(*-src这种)可以查看 MDN 的 CSP 指令文档,我数了一下,具体有 29 种指令。而具体的指令内容的书写方式除了 'self' 这种表示自身域,media1.com这种表示具体的域名之外,还有总共 13 种类型写法,具体可以查看 CSP source values。