FrankKai / FrankKai.github.io

FE blog
https://frankkai.github.io/
363 stars 39 forks source link

内容安全策略CSP是什么? #244

Open FrankKai opened 3 years ago

FrankKai commented 3 years ago

当我们谈起如何防范web安全中的XSS攻击时,通常会说:浏览器引入了内容安全策略,也就是CSP(Content Security Policy),去解决XSS攻击的问题。

有人说,CSP的核心思想是让服务器决定浏览器能够加载哪些资源,相当于一个前端资源白名单。这样做的目的是抵御XSS攻击,提升前端安全性。

那么CSP到底什么呢? 这句对CSP的概括是否准确呢?

CSP前言

Content Security Policy(CSP)是一个检测和减轻确定类型攻击的内容安全层,这些确定攻击类型包括XSS(Cross Site Scripting)攻击和数据注入攻击。这些攻击可以造成网站的数据盗窃,网站污损和恶意软件安装。

CSP是完全的向后兼容的(除了CSP2.0版本有一些明显的在兼容性上的问题;更多细节可以看1.1章节)。 服务器实现了CSP而浏览器不支持的,浏览器可以正常工作,但是浏览器会忽略CSP,默认使用标准的web同源策略。如果网站没有提供CSP头,浏览器同样会使用标准的同源策略。

为了开启CSP,你需要配置的web服务器(Apache, Nginx) 去返回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'; ">

面临的威胁

缓解XSS攻击

设计CSP的一个重要原因就是缓解和报告XSS攻击。XSS利用浏览器对服务器接收的内容的信任发起攻击。因为浏览器信任内容源,所以恶意脚本在受害者的浏览执行,即使内容并不是来自于它应该来自的地方。

CSP通过指定浏览器的源,可以使得服务器管理者减少或者消除XSS发起的攻击。一个CSP兼容的浏览器会只接收在白名单域名下的资源文件,忽略其他脚本(内联脚本或者事件处理html属性)

还有一个最终的保护形式,全局禁止脚本执行可以使得站点上的所有脚本不执行。

缓解数据包嗅探攻击

除了限制哪些源可以加载内容以外,服务器还可以指定哪个协议和端口被使用;例如(来自一个理想的标准端口),一个服务器可以指定所有内容都通过HTTPS加载。一个完整的数据传输安全策略不仅仅包含HTTPS传输数据,也包括通过设置cookie的secure属性并且自动重定向到HTTP页面到HTTPS页面。网站可以使用strict-Transport-SecurityHTTP头去确保只通过加密通过去连接浏览器和服务器。

如何使用CSP

配置内容安全策略主要是通过给网页增加Content-Security-PolicyHTTP头,设置这个头的值可以控制用户端可以加载哪些资源。例如, 一个上传和展示图片的页面,需要允许任何地方的图片都可以展示,但是提交表单的时候需要限制到指定端口。 一个适当设计的内容安全策略可以阻止网站受到XSS攻击。这个文章将解释如何设置内容安全头。

指定你的策略

你可以使用Content-Security-PolicyHTTP头去设置策略,例如:

Content-Security-Policy: policy

policy是一个字符串,用于描述你的内容安全策略。

写一个策略

使用一系列策略指令来描述策略,每个策略指令都描述特定资源类型或策略区域的策略。您的策略应包括default-src策略指令,这是其他资源类型没有自己的策略时的后备(有关完整列表,请参阅default-src指令的说明)。策略需要包括default-src或script-src指令,以防止运行内联脚本以及阻止使用eval()。策略需要包括default-src或style-src指令,以限制从