返回 登录
0

内容安全策略CSP在阿里云的实施

摘要:
点点帮是我们公司推出的一款用于手机社区软件。本软件的功能非常强大,包括社区物业、交流广场、商城购物几大功能模块。在点点帮中,用户可以体验到更便捷、舒适的生活环境,认识更多的朋友。由于网站HTTPS化的大势所趋,了解到把网站升级到HTTPS有很多优点,但迁移最大的问题在于迁移时间。如果在阿里云上的主站点迁移到HTTPS,而网页嵌入的对象没有迁移,浏览器就会阻止这些没有迁移的资源的呈现。那么,有没有一种简单的实施技巧来完成HTTPS升级呢?且听我一一道来。

一、HTTPS升级的趋势
目前,很多网站纷纷向HTTPS迁移,但迁移最大的问题在于迁移时间。如果主站点迁移到HTTPS,而网页嵌入的对象没有迁移,那么浏览器会阻止这些没有迁移的资源的呈现。最好的做法是将嵌入的对象迁移到安全站点并更新源码。然而,更改源码是一个漫长而困难的过程。在这种情况下,内容安全策略Content-Security-Policy就非常有用了。
全站做HTTPS迁移是很困难的,可以考虑使用报头的“Content-Security-policy: upgrade-insecure-request”项来减少嵌入式对象的混合内容的错误(“mixed-content”)。最后,使用报头的Strict-Transport-Security项来对域和子域安全加固。

二、内容安全策略CSP的上云技巧
根据W3C的描述,CSP是“一种让Web开发者控制资源的机制,它是一个可以提取或执行的特殊页面,以及带有多个与安全性相关的策略决策。”其中一个指令是升级不安全的请求。当此指令用在报头或HTML元标记时,浏览器会自动将HTTP请求升级。
根据文档,应该升级两种链接:
1)被动的混合内容
内嵌链接:比如图片、CSS样式表、JavaScript脚本的引用的链接
导航链接:放置在标签中的链接
2)活动的混合内容
通常是Ajax调用/XHR请求
在HTTPS报头中加入了以下报头字段:

Content-Security-Policy:upgrade-insecure-requests

这样就可以将所有不安全的资源请求从网页自动升级为安全版本,网页HTML代码:

<img src =“http://example.com/image.png”>
<img src =“http://not-example.com/image.png”>

浏览器会认为资源请求为:

<img src =“https://example.com/image.png”>
<img src =“https://not-example.com/image.png”>

三、CSP上云技巧深入
但在阿里云上HTTPS化的真实情况远比W3C规范的定义更加复杂,具体如下:

1、浏览器的支持
首先,并不是所有的浏览器都支持CSP。Firefox、Chrome和Opera支持CSP指令,而IE、Edge和Safari目前不支持CSP。
图片描述
2、例外
尽管W3C文档提到导航链接被升级到HTTPS,但是Chrome浏览器和Firefox对这一点却有不同的处理解释。
Mozilla对导航链接是这么说的:
* 同一个域的链接将升级
* 第三方的链接将不升级
而Chrome对导航链接是这么说的:
* 注意,在锚标签的href属性中包含了“http://”内容的导航链接将不升级。
3、第三方内容
第三方内容不升级。由于浏览器不知道这些域是否支持HTTPS,因此它们不会被升级。在目前的版本中,这项内容会被静默阻止。可以通过打开Firefox / Chrome中的开发者工具并导航到控制台窗口来找到这些已屏蔽的内容。看起来像以下的例子:
图片描述

四、CSP上云实践的下一步
通过使用报头的CSP项,大多数嵌入对象的错误可以移除。CSP也支持报告。启用此功能后,可以获取到被浏览器“阻止/警告”的一组网址,并在源代码中修复。
1、HSTS
HSTS即HTTP Strict Transport Security,HTTP严格传输安全,是一套由IETF组织发布的互联网安全策略机制。网站可以选择使用HSTS策略,来让浏览器强制使用HTTPS与网站进行通信,以减少会话劫持的风险。HSTS的作用是强制客户端(如浏览器)使用HTTPS与服务器创建连接。服务器开启HSTS的方法是,当客户端通过HTTPS发出请求时,在服务器返回的超文本传输协议响应头中包含Strict-Transport-Security字段。非加密传输时设置的HSTS字段无效。
使用报头的Strict-Transport-Security选项时,浏览器将确保对域(和子域)的所有请求都通过HTTPS进行。这就消除了计划升级报头的缺点。比如:

Strict-Transport-Security: max-age=31536000; includeSubDomains

上面的报头字段信息解释如下:
1. 在随后的31536000秒中,浏览器只要向该域名或子域名发送HTTP请求时,必须采用HTTPS协议发起连接请求。
2.如果该服务器发送的TLS证书无效,用户不能忽略浏览器警告继续访问网站。
2、Cookie
还有一个需要注意的地方是,确保浏览器只在使用 HTTPS 时,才发送Cookie。可以在网站的响应报头中的Set-Cookie字段加上Secure标志,如下:

Set-Cookie: LSID=DQAAAK...Eaem_vYg; Secure

要说明两点:
1. 无论 HTTP连接或HTTPS连接,只要Set-Cookie字段加上了Secure标志,那么只有在使用了HTTPS连接时才会返回Cookie内容。
2. 无论 HTTP连接或HTTPS连接,如果Set-Cookie字段没有Secure标志,那么HTTP连接或HTTPS连接都会返回Cookie,且在使用HTTP连接时,存在泄露信息的风险。

五、最后
采用了以上的手段,在阿里云上网站实施HTTPS化再也不是问题了。借助阿里云的服务器安全即安骑士产品和阿里云的Web应用防火墙WAF产品,运营人员基本上就无需担忧整个网站的安全问题了。

评论