diff --git a/published/20160809 Part 3 - Let’s Build A Web Server.md b/published/20160809 Part 3 - Let’s Build A Web Server.md index 9162ce1d3b..cec997dc3a 100644 --- a/published/20160809 Part 3 - Let’s Build A Web Server.md +++ b/published/20160809 Part 3 - Let’s Build A Web Server.md @@ -976,7 +976,7 @@ $ python webserver3g.py $ python client3.py --max-clients 128 ``` -现在来查看一下,确保没有僵尸进程存在。耶!没有僵尸的生活真美好 ^_^ +现在来查看一下,确保没有僵尸进程存在。耶!没有僵尸的生活真美好 `^_^`。 ![](https://ruslanspivak.com/lsbaws-part3/lsbaws_part3_conc5_no_zombies.png) @@ -984,7 +984,7 @@ $ python client3.py --max-clients 128 恭喜!你刚刚经历了一段很长的旅程,我希望你能够喜欢它。现在你拥有了自己的简易并发服务器,并且这段代码能够为你在继续研究生产级 Web 服务器的路上奠定基础。 -我将会留一个作业:你需要将第二部分中的 WSGI 服务器升级,将它改造为一个并发服务器。你可以在[这里][12]找到更改后的代码。但是,当你实现了自己的版本之后,你才应该来看我的代码。你已经拥有了实现这个服务器所需的所有信息。所以,快去实现它吧 ^_^ +我将会留一个作业:你需要将第二部分中的 WSGI 服务器升级,将它改造为一个并发服务器。你可以在[这里][12]找到更改后的代码。但是,当你实现了自己的版本之后,你才应该来看我的代码。你已经拥有了实现这个服务器所需的所有信息。所以,快去实现它吧 `^_^`。 然后要做什么呢?乔希·比林斯说过: diff --git a/published/20160912 Content Security Policy, Your Future Best Friend.md b/published/20160912 Content Security Policy, Your Future Best Friend.md new file mode 100644 index 0000000000..90cd08e208 --- /dev/null +++ b/published/20160912 Content Security Policy, Your Future Best Friend.md @@ -0,0 +1,231 @@ +内容安全策略(CSP),防御 XSS 攻击的好助手 +===== + +很久之前,我的个人网站被攻击了。我不知道它是如何发生的,但它确实发生了。幸运的是,攻击带来的破坏是很小的:一小段 JavaScript 被注入到了某些页面的底部。我更新了 FTP 和其它的口令,清理了一些文件,事情就这样结束了。 + +有一点使我很恼火:在当时,还没有一种简便的方案能够使我知道那里有问题,更重要的是能够保护网站的访客不被这段恼人的代码所扰。 + +现在有一种方案出现了,这种技术在上述两方面都十分的成功。它就是内容安全策略(content security policy,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)或端口,它就会强制选择与当前页面相同的协议或端口。这样做防止了混合内容(LCTT 译注:混合内容指 HTTPS 页面中也有非 HTTPS 资源,可参见: https://developer.mozilla.org/zh-CN/docs/Security/MixedContent )。如果页面是 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 文件中 data 内嵌内容。 + +在 CSP 1 规范下,你也可以设置如下规则: + +- `img-src` 有效的图片来源 +- `connect-src` 应用于 XMLHttpRequest(AJAX),WebSocket 或 EventSource +- `font-src` 有效的字体来源 +- `object-src` 有效的插件来源(例如,``,``,``) +- `media-src` 有效的 `