内容安全策略(CSP)是一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括跨站脚本 (XSS) 和数据包嗅探攻击等。
网站维护者使用CSP去定义一些内容来源的规则,然后通过某种方式将这些规则告诉浏览器,浏览器根据这些规则来判定哪些来源的内容是安全的,可以使用的。
1、使用 元素配置该策略
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';">
2、通过返回 Content-Security-Policy
这个 HTTP Header 即可,这个 Header 对应的值就是我们 web 内容来源的规则。旧版本中是X-Content-Security-Policy
。
2.1、跨站脚本攻击-XSS
CSP 的主要目标是减少 XSS 攻击。
CSP通过指定有效域——即浏览器认可的可执行脚本的有效来源——使服务器管理者有能力减少或消除XSS攻击所依赖的载体。一个CSP兼容的浏览器将会仅执行从白名单域获取到的脚本文件,忽略所有的其他脚本 (包括内联脚本和HTML的事件处理属性)。
2.2、数据包嗅探攻击
除限制可以加载内容的域,服务器还可指明哪种协议允许使用;比如 (从理想化的安全角度来说),服务器可指定所有内容必须通过HTTPS加载。一个完整的数据安全传输策略不仅强制使用HTTPS进行数据传输,也为所有的cookie标记安全标识 cookies with the secure flag,并且提供自动的重定向使得HTTP页面导向HTTPS版本。网站也可以使用 Strict-Transport-Security HTTP头部确保连接它的浏览器只使用加密通道。
配置内容安全策略涉及到添加 Content-Security-Policy HTTP头部到一个页面,并配置相应的值,以控制用户代理(浏览器等)可以为该页面获取哪些资源。
你以使用 Content-Security-Policy
HTTP头部来指定策略,像这样:
Content-Security-Policy: policy
policy参数是一个包含了各种描述CSP策略指令的字符串。
描述策略:
一个策略由一系列策略指令所组成,每个策略指令都描述了一个针对某个特定类型资源以及生效范围的策略。你的策略应当包含一个default-src策略指令,在其他资源类型没有符合自己的策略时应用该策略,策略可以包含default-src,或者 script-src (en-US) 指令来防止内联脚本运行,,并杜绝eval()的使用;也可包含一个 default-src 或 style-src (en-US) 指令去限制来自一个
常见指令:
script-src:这个指令规定了网站中可执行脚本的来源,同时也控制了 XSLT 的来源;
style-src:定义了样式文件的来源;
media-src:规定了富媒体(音视频、视频文本轨格式)资源的来源;
child-src:规定了像 worker 、frame 这种嵌入可使用的链接;
font-src:规定了字体的来源,如果在网页中使用了第三方字体可以使用这个指令;
img-src:规定了网站中的图片的来源;
form-action:规定了网页中的 form 元素 action 的可提交地址;
connect-src:规定了脚本中发起连接的地址,像 XMLHttpRequest 的 send 方法、WebSocket 连接地址、EventSource 等;
frame-src:这个指令规定了 frame 的可使用链接。在 CSP level 2 中废弃了,文档中叫我们用 child-src 来代替这个指令,但在 level 3 中恢复使用;
object-src:规定了一些插件的来源,像 Flash 等;
report-uri:这个指令是指定一个 CSP 上报地址,当浏览器检测到有不通过指令时,将通过这个指定地址进行上报。值得注意的是,这个指令不能在 meta 元素中使用,并且在 CSP level3 中这个指令会被废弃,用 report-to 来代替,为了保证这个指令有效,官方推荐 report-uri & report-to 同时使用;
worker-src:这个指令是 CSP level3 中加的,规定了 Worker、SharedWorker、serviceWorker 中可用的地址;
base-uri:规定了页面 base 标签中的链接;
frame-ancestors:规定了当前的页面可以被哪些来源所嵌入。作用于 <frame>, <iframe>, <embed>, <applet>。该指令不能通过 <meta>指定且只对非 HTML 文档类型的资源生效;
4.1、示例 1
一个网站管理者想要所有内容均来自站点的同一个源 (不包括其子域名)
Content-Security-Policy: default-src 'self'
4.2、示例 2
一个网站管理者允许内容来自信任的域名及其子域名 (域名不必须与CSP设置所在的域名相同)
Content-Security-Policy: default-src 'self' *.trusted.com
4.3、示例 3
一个网站管理者允许网页应用的用户在他们自己的内容中包含来自任何源的图片, 但是限制音频或视频需从信任的资源提供者(获得),所有脚本必须从特定主机服务器获取可信的代码.
Content-Security-Policy: default-src 'self'; img-src *; media-src media1.com media2.com; script-src userscripts.example.com
4.4、示例 4
一个线上银行网站的管理者想要确保网站的所有内容都要通过SSL方式获取,以避免攻击者窃听用户发出的请求。
Content-Security-Policy: default-src https://onlinebanking.jumbobank.com
该服务器仅允许通过HTTPS方式并仅从onlinebanking.jumbobank.com域名来访问文档。
4.5、示例 5
一个在线邮箱的管理者想要允许在邮件里包含HTML,同样图片允许从任何地方加载,但不允许JavaScript或者其他潜在的危险内容(从任意位置加载)。
Content-Security-Policy: default-src 'self' *.mailsite.com; img-src *
注意这个示例并未指定script-src (en-US)。在此CSP示例中,站点通过 default-src 指令对其进行配置,这同样意味着脚本文件仅允许从原始服务器获取。
参考:https://developer.mozilla.org/zh-CN/docs/web/http/csp