内容安全策略(Content Security Policy)

内容安全策略(Content Security Policy)



内容安全策略(Content Security Policy)是一种声明的安全机制,可以让网站运营者能够控制遵循CSP的用户代理(通常是浏览器)的行为。通过控制要启用哪些功能,以及从哪里下载内容,可以减少网站的攻击面。

CSP的主要目的是防御跨站点脚本(cross-ste scripting,XSS)攻击。例如,CSP可以完全禁止内联的JavaScript,并且控制外部代码从哪里加载。它也可以禁止动态代码执行。禁用了所有的攻击源,XSS攻击变得更加困难。

CSP由Mozilla开发,曾经有几年试验过概念,一开始称为内容限制(content restriction),后来改称为内容安全策略。2012年11月CSP 1.0成为W3C的候选议案。

网站通过设置Content-Security-Policy响应头启用所需的CSP策略。

策略实例:

Content-Security-Policy: default-src ‘self’; img-src *;
                         object-src *.cdn.chziyue.com;
                         script-src scripts.chziyue.com


该策略默认只允许资源从同一来源加载,但允许图像从任何URI加载,插件内容只从指定的CDN地址加载,外部脚本仅从scripts.chziyue.com加载。

不像HSTS,CSP策略不是持久的;只在引用他们的页面上生效,之后就消失了。因此,使用CSP风险要小很多。如果产生错误,策略可以立即更新生效。即使被注入响应头,也不会有持续性拒绝服务攻击的风险。


防止混合内容问题

如果安全网页依赖的资源(例如,图像和脚本)是通过明文连接检索的,就会出现混合内容问题。这些年浏览器虽然对这个问题的处理有改善,但它们的方法通常仍然太过宽松。例如,所有浏览器都允许所谓的被动式混合内容(passive mixed content),通常是图像。不出所料的是,在不同浏览器上也有处理差异。例如,Safari目前不强加任何限制,甚至对脚本也是。

因为CSP让我们能够控制其中的内容来源,所以可以用它来指导遵循CSP的浏览器只使用安全协议,也就是对WebSocket协议用wss,剩下的其他都用https。

因此,只解决混合内容问题,而不尝试改善其他的话,可以考虑下面的CSP策略作为出发点:

Content-Security-Policy: default-src https: 'unsafe-inline' 'unsafe-eval';
             connect-src https: wss:


该策略包括以下三个主要内容:

  • default-src指令确定该页面可以从任何地方(任何主机和任何端口)加载提供了安全连接(https)的内容

  • ‘unsafe-inline’和‘unsafe-eval’表达式重新启用内联JavaScript和动态代码执行,这些默认情况下都是被CSP禁用的。理想情况下,通常不会希望在策略里保留这些表达式,但没有它们大多数现有的应用都会被阻断。

  • connect-src指令控制脚本接口(本如XMLHttpRequest、WebSockets、EventEource等)所使用的内容位置。

一旦确立了最初的策略可以工作,请考虑收紧JavaScript执行(通过删除‘unsafe-inline’和’unsafe-eval’表达式),并用更具体的主机取代通用源的限制(例如,使用https://cdn.chziyue.com取代https)。


策略测试

有关CSP的一个好处是,能够在执行一个策略的同时并行测试其他策略。这意味着,可以在比开发环境要复杂得多的生产环境中部署测试策略。

Content-Security-Policy-Report-Only响应头用于创建一个仅用于测试的策略:

Content-Security-Policy-Report-Only: default-src ‘self’


如果只启用报告的策略出错,并不会阻塞请求,但可以配置报告使得故障可被传递回起初的网站。


浏览器支持

当前浏览器对CSP的支持较好。Chrome和Firefox试验了多年,而且最近其他主流浏览器也逐步开始支持。桌面浏览器里面唯一不支持CSP的是Internet Explorer。Microsoft的新一代浏览器Edge,在Windows 10中首次亮相,支持CSP 1.0。


你可能感兴趣的:(web安全)