内容安全策略(CSP)(这种用法在 https://www.w3.org/html/ig/zh/wiki/CSP 的介绍那部分有,其它地方似乎不作翻译,个人认为这样更合适些),你未来最好的助手 ===== 很久之前,我的个人网站被攻击了。我不知道它是如何发生的,但它确实发生了。幸运的是,攻击带来的破坏是很小的:一小段 JavaScript 被注入到了某些页面的底部。我更新了 FTP 和其它的凭证,清理了一些文件,事情就这样结束了。 有一点使我很恼火:在当时,还没有一种简便的方案能够使我知道那里有问题,更重要的是能够保护网站的访客不被这段恼人的代码所扰。 现在有一种方案出现了,这种技术在两方面都十分的成功。它就是内容安全策略(CSP)。 ### 什么是 CSP? 这个想法十分简单:网站通过发送一个 CSP 头部,来告诉浏览器什么是被授权执行的与什么是需要被禁止的。 这里有一个 PHP 的例子: ``` "); ?> ``` #### 一些指令 你可以定义一些全局规则或者定义一些涉及某一类资源的规则: ``` default-src 'self' ; # self = 同端口,同域名,同协议 => 允许 ``` 基础参数是 default-src:如果没有为某一类资源设置指令规则,那么浏览器就会使用这个参数值。 ``` script-src 'self' www.google-analytics.com ; # 从这些域名来的 JS 文件 => 允许 ``` 在这个例子中,我们已经授权了 www.google-analytics.com 这个域名来源的 JavaScript 文件使用到我们的网站上。我们也添加了 'self' 这个关键词;如果我们通过 script-src 来重新设置其它的规则指令,它将会覆盖 default-src 规则。 如果协议或端口没有被指明(这里的 scheme 从下文来看指的应该是 http https 这样的协议,所以这样翻,不知道是否合适),它就会强制选择与当前页面相同的协议或端口执行。这样做防止了混合内容(这个翻译的话 https://developer.mozilla.org/zh-CN/docs/Security/MixedContent 在这个内容中我可以看到有相关的翻译方式,但是这里要说的是这个概念和之前的 scheme 一样可能会包含较为丰富的内容,不清楚是否要添加一些注释)。如果页面是 https://example.com,那么你将无法加载 http://www.google-analytics.com/file.js 因为它已经被禁止了(协议不匹配)。然而,有一个例外就是协议的提升是被允许的。如果 http://example.com 尝试加载 https://www.google-analytics.com/file.js,接着协议或端口允许被更改以便协议的提升。 ``` style-src 'self' data: ; # Data-Uri 嵌入 CSS => 允许 ``` 在这个例子中,关键词 data:授权了在 CSS 文件中内嵌内容。 在 CSP 1 规范下,你可能也会设置如下规则: - `img-src` 有效的图片来源 - `connect-src` 应用于 XMLHttpRequest(AJAX),WebSocket 或 EventSource - `font-src` 有效的字体来源 - `object-src` 有效的插件来源(例如,``) - `media-src` 有效的 `