75CDN 增加 SRI 支持

提醒:本文最后更新于 2557 天前,文中所描述的信息可能已发生改变,请谨慎使用。

Featured Image

75CDN 是一个由奇舞团维护的静态资源托管平台,创立至今已经稳定运行了一年多的时间。近期我们增加了 SRI 的支持,作为国内首个提供 SRI 服务的静态资源库了,也算是为 75CDN 一周年庆生吧。

SRI 全称是 Subresource Integrity,是用来解决由于 CDN 资源被污染而导致的 XSS 漏洞的方案。当浏览器检测加载脚本签名与给定的签名不一致时,会拒绝执行该脚本。目前浏览器的支持情况如下:

浏览器支持版本
Chrome 以及 Chrome for Android45+
Firefox 以及 Firefox Mobile43+
Safari 以及 iOS Safari11+
IE 以及 Edge不支持
UC 浏览器不支持

注: 数据来源于 CanIUseMDN

开启 SRI 功能

SRI 开启需要有两个条件:首先需要资源为同域或者开启 CORS 设置,然后需要在<script>中提供签名以供校验。由于 SRI 在不匹配的时候就不执行脚本,考虑到这个比较“强力”,75CDN 目前需要手动开启 SRI 格式的显示。75CDN 支持两种方式开启显示:

  • 在 url 上增加 ?sri=1 临时开启当前模块的 SRI 支持,例如:https://cdn.baomitu.com/jquery?sri=1。
  • 在控制台中执行 cdn.sri = true 永久开启全站模块的 SRI 支持,设置为 false 则可以关闭。

开启后直接在具体资源地址右侧选择“复制<script>标签”或者“复制<link>标签”按钮即可获得带有 SRI 支持的 HTML 代码,例如:

<script 
    crossorigin="anonymous" 
    integrity="sha384-xBuQ/xzmlsLoJpyjoggmTEz8OWUFM0/RC5BsqQBDX2v5cMvDHcMakNTNrHIW2I5f" 
    src="http://lib.baomitu.com/jquery/3.2.1/jquery.min.js"
><script>

对于没有提供 SRI 服务的 CDN 也可以自己计算,其中 SRI Hash Generator 就是一个帮助开发者计算资源签名的平台。

SRI 的使用

刚才也说到了,当资源不匹配的时候浏览器是会拒绝执行脚本的。这虽然保障了网页的安全性,但是这样让页面变的不可用对用户来说其实是极不友好的。考虑到这种情况我们最好在资源加载失败后提供一个 fallback 方案,例如请求本站资源。同时一般网络劫持具有区域性特征,我们也可以打点上报case,可以统计查看被劫持情况。下面是个简单的例子:

var s = document.createElement('script');
s.crossOrigin = 'anonymous';
s.integrity="sha384-qu2J8HSjv8EaYlbzBdbVeJncuCmfBqnZ4h3UIBZ9WTZ/5Wrqt0/9hofL0046NCkc";
s.onerror = function() {
  // 打点上报劫持数据
  var img = document.createElement('img');
  img.src = 'http://xxx.com?url='+s.src;
  document.body.appendChild(img);

  // 更换其他域名下载地址
  s.src = 'http://zeptojs.com/zepto.min.js';  
};
s.onload = function() {
  console.log($);
}
s.src = 'http://lib.baomitu.com/zepto/1.2.0/zepto.min.js';
document.head.appendChild(s);

CSP 3

除了 SRI 能够保障网站安全的引入 CDN 资源之外,其实 CSP 也能帮助我们防止 XSS 攻击。CSP 全称是 Content Security Policy,目前协议已经发展到 Level 3 版本了。它是一个用来定义页面可以加载或执行哪些资源的协议,通过限制可能不安全资源的加载来达到安全的目的。

它的一个特色是向后兼容,不支持的浏览器设置了也没什么问题。可以在请求头中配置不同的加载策略,同时还天然支持对不安全资源加载进行上报。在 CSP2 中协议支持了可以使用白名单的形式配置安全资源,例如:

Content-Security-Policy: script-src 'sha384-xBuQ/xzmlsLoJpyjoggmTEz8OWUFM0/RC5BsqQBDX2v5cMvDHcMakNTNrHIW2I5f'

可以看到 CSP 的资源白名单配置的签名和 SRI 的签名是一致的,而且由于向后兼容不影响不支持的版本,所以我们也可以利用起来。关于 CSP 的更多内容可以查看文末的参考资料。

总结

75CDN 已经一周年了,除了给大家带来了 SRI 保障大家的资源加载安全之外,我们还会为大家带来更稳定的服务以及更多使用的功能,请大家多多支持!

参考资料:

Avatar
怡红公子 擅长前端和 Node.js 服务端方向。热爱开源时常在 Github 上活跃,也是博客爱好者,喜欢将所学内容总结成文章分享给他人。

3 评论

明远网络工作室 Chrome62.0 Mac OS 10.13.1
2017-11-20 13:20:23 回复

能坚持下来的库太少了 以前360搞了一个 后来停止访问 好多站都打不开

公子 Chrome62.0 Mac OS 10.13.2
2017-11-21 01:56:10 回复

@明远网络工作室 所以我们为了解决这个问题,把服务和 CDN 分离,网站挂了也没关系,CDN 是会一直在的(因为公司服务用的它),所以其它人引的地址是不会挂的。

个人博客 Chrome55.0 Windows 7
2017-11-18 14:20:27 回复

进来看看