azl397985856 / fe-interview

宇宙最强的前端面试指南 (https://lucifer.ren/fe-interview)
Apache License 2.0
2.84k stars 260 forks source link

【每日一题】- 2020-04-09 - 什么是CSP,它有什么用? #112

Closed azl397985856 closed 4 years ago

suukii commented 4 years ago

what it is

一个网页可以跟各种网络资源打交道,比如请求 JS 或者 CSS 文件,发送 AJAX 请求,加载图片/字体文件等,在这些过程中很有可能会发生 XSS 或者代码注入攻击等。

为了防御攻击,就有了 CSP(Content Security Policy),它是一层安全保障,用来约束浏览器只能从白名单站点下载 scripts(包括 inline scripts)、styles、媒体文件等资源。

P.S. 虽然 CSP 可以减少 XSS 攻击的风险,但它不能完全替代校验用户输入以及编码输出这些安全性检查操作

how it works

开启 CSP 有两个方法:

CSP 设置内容:

不管使用以上哪种方法,CSP 的内容设置都是一样的,一个 CSP 设置包含了一系列允许和禁止的操作,写法上,它是由一系列“指令+源”(directive + resource)组成的。指令和源中间以空格分隔,一个指令可以指定多个源,每个源也以空格分隔。每个“指令+源”组合中间使用 ; 隔开。

通过指令我们可以控制网站的一些行为,以下是一些例子

script-src 'self' *.mozilla.com: 'self' 是一个关键字,表示允许从当前域(不包括子域)下载 js 文件,*.mozilla.com 表示来自 mozilla.com 的 js 文件也可以下载

default-src 'none': 'none' 表示不信任来自任何站点的资源

w3.org完整指令列表

report mode

以上所说的是 enforce 模式的 CSP,也就是 Content-Security-Policy 头部里面指定的的指令都会被执行。CSP 还有另外一个模式 report 模式,在这种模式下,指令不会被执行,也就是,网站该下载什么文件照样下载,即使下载源不在白名单里,不过如果网站发生了违反 CSP 设置的行为的话,比如向非白名单源请求 js 文件,浏览器就会向指定的服务端发送一份报告。

开启 report 模式只需要使用 Content-Security-Policy-Report-Only 头部即可,内容设置的规则和 Content-Security-Policy 是一样的,而且,这两个头部是可以同时存在,互不干扰的。

另外,在 enforce 模式下,如果 CSP 设置有被违反的话,默认是不会向服务端发送报告的,我们可以通过 report-uri example.com 指令来开启这个功能。

azl397985856 commented 4 years ago

CSP 指的是内容安全策略,它的本质是建立一个白名单,告诉浏览器哪些外部资源可以加载和执行。我们只需要配置规则,如何拦截由浏览器自己来实现。

通常有两种方式来开启 CSP,一种是设置 HTTP 首部中的 Content-Security-Policy,一种是设置 meta 标签的方式

stale[bot] commented 4 years ago

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.