CSP (Content Security Policy) 是一种 HTTP 响应头,用来限制 Web 页面可以加载的资源 (脚本、样式表、图片、字体等) 的来源。作为能够大幅减轻 XSS 攻击危害的安全机制,它得到了 OWASP 的推荐。
CSP 的基本原理,是把「本页面只允许加载来自这些来源的资源」这样一份白名单告知浏览器。例如设置 `Content-Security-Policy: script-src 'self' https://cdn.example.com` 之后,就只允许执行来自本站和 `cdn.example.com` 的脚本,攻击者注入的内联脚本会被拦截。
引入 CSP 时最费力的,是应对既有的内联脚本和内联样式。CSP 默认禁止内联代码的执行,因此 `onclick` 属性以及 <script> 标签内的代码都会失效。应对办法有两种:一是使用 nonce 也就是一次性令牌,二是使用 hash 也就是脚本的哈希值。nonce 方式由服务器为每个请求生成一个随机值,并在脚本标签和 CSP 响应头两处设置相同的值。
安全的引入步骤是:先用 `Content-Security-Policy-Report-Only` 响应头,以「只报告违规而不拦截」的模式运行,分析报告之后再正式应用到生产环境。