使用内容安全策略(CSP)阻止XSS

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

CSP被设计成完全向后兼容。不支持CSP的浏览器也能与实现了CSP的服务器正常合作,反之亦然:不支持CSP的浏览器只会忽略它,如常运行,默认为网页内容使用标准的同源策略。如果网站不提供CSP头部,浏览器也使用标准的同源策略。

为使CSP可用, 你需要配置你的网络服务器返回 Content-Security-Policy HTTP头部。

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

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

原理

CSP的主要目标是减少XSS攻击。CSP通过指定有效域(即浏览器认可的可执行脚本的有效来源)使开发者有能力减少或消除XSS攻击所依赖的载体。一个CSP兼容的浏览器将会仅执行从白名单域获取到的脚本文件,忽略所有的其他脚本(包括内联脚本和HTML的事件处理属性)。

使用

配置内容安全策略涉及到添加 Content-Security-Policy HTTP头部到一个页面,并配置相应的值,以控制浏览器可以为该页面获取哪些资源。

所有的内容都来自于站点的同一个源

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

允许内容来自信任的域名和子域名

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

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

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

所有内容通过SSL方式获取

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