HTTP Content-Security-Policy CSP策略

发布时间 2023-06-03 21:43:42作者: 云霄宇霁

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

     CSP被设计完全向后兼容,不支持CSP的浏览器也能与实现了CSP的服务器正常工作只是忽略它如常运行,如果网站不提供CSP标头,浏览器默认使用标准的同源策略。

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

    CSP的主要目标是减少和报告XSS攻击。XSS攻击利用了浏览器对于从服务器所获取的内容的信任。恶意的脚本在受害者的浏览器中得以运行,因为浏览器信任其内容来源,即使有些时候这些脚本来自它本不该来的地方。

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

     作为一种终极防护形式,始终不允许执行脚本的站点可以选择全面禁止脚本执行。

      除限制可以加载内容的域,服务器还可以指明哪种协议允许使用;比如服务器可指定所有内容必须通过HTTPS加载。一个完整数据传输策略不仅强制使用HTTPS进行数据传输,也为所有的cookie 标记secure标识,并且提供自动的重定向使得HTTP页面导向HTTPS版本。网站也可以使用 Strict-Transport-Security, HTTP标头确保连接它1浏览器只使用加密通道。

  使用CSP

    配置内容安全策略涉及到添加 Content-Security-Policy HTTP标头到页面,并配置相应的值,以控制用户代理(浏览器等)可以为该页面获取哪些资源。比如一个上传文件和显示图片页面,应该允许图片来自任何地方,但限制表单的action属性只可以赋值为指定的端点。一个经过恰当设计的内容安全策略应该可以有效的保护页面免受跨站脚本攻击。

   编写策略

    default-src: 在其他资源类型没有符合自己的策略时应用该策略

     一个策略可以包含default-src 或者 script-src 指令防止内连脚本运行,并杜绝eval()的使用。

     一个策略也可以包含一个default-src 或style-src 指令去限制来自一个<style>元素或者style属性的内连样式。

     对于不同类型的项目都有特定的指令,因此每种类型都可以有自己的执行,包括字体,frame,图像,音频和视频媒体,script和worker。

 常见示例:

 1、一个网站想要所有内容都来自同一个源(不包含其子域名)

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

2、一个网站允许内容来自同源及其信任的域名(域名不必须与CSP设置所在的域名相同)

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

3、一个网站允许内容中图片来自任何源,但是限制音频或视频需从信任的源获取,所有脚本必须从指定的源获取

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

4、一个网站所有内容都必须通过SSL并且指定的域名获取,以避免攻击者窃听用户发出的请求

Content-Security-Policy: default-src https://online.com

5、一个网站包含HTML来自同源或者mailsite.com,图片来源任何源,但不允许JavaScript从任意源加载,注意:这个示例并未指定script-scr,但站点通过default-scr指令对其进行配置,同样意味着脚本文件仅允许从原始服务器获取

Content-Security-Policy: default-src 'self' *.mailsite.com;img-src *

 

对策略进行测试

将Content-Security-Policy 部署为仅报告(report-only)模式。在此模式下,CSP策略不是强制性的,但是任何违规行为将会报告给一个指定的URI地址。

Content-Security-Policy-Report-Only: policy

如果Content-Security-Policy-Report-Only和Content-Security-Policy同时出现在一个响应中,两个策略均有效。在Content-Security-Policy header中指定的策略有强制性,而Content-Security-Policy-Report-Only中的策略仅产生报告而不具有强制性。

支持CSP的浏览器始终将对于每个企图违反你所建立的策略都发送违规报告,如果策略里包含一个有效的report-uri指令

Content-Security-Policy: default-src 'self';report-uri http://reportcollector.example.com/collector.cgi