提供jQuery的CDN有多安全?

我们构建具有公共(非安全)区域和安全(通过HTTPS提供)区域的站点,我们使用jQuery库。

最近我建议我们使用Google CDN进行jQuery交付。 我的一些同事对这种提供JavaScript库的方式的安全方面表示担忧。

例如,他们提到有人可能会劫持DNS服务器,然后注入恶意修改的库,为不同的安全攻击打开大门。 现在,如果黑客可以通过谷歌CDN注入恶意代码,那么如果从网站本身提供jQuery,他可能也会这样做,对吗?

谷歌CDN似乎支持通过SSL服务库。

从CDN服务jQuery真的不那么安全,而不是从服务器本身服务吗? 这种威胁有多严重?

减轻风险的一种方法是对从谷歌获得的文件运行校验和,并将其与已经拥有的已知良好校验和进行比较。

在回答关于Google是否以任何方式改变这些文件的问题时,Google员工Ben Lisbakken建议将 Google提供的文件的MD5校验和与从其维护者的主站点获得的同一文件的规范版本进行比较。 阅读链接网站上的评论8以获取上下文。

如果您担心DNS劫持,那么当然同样的问题将适用于从“原始”网站获得的文件。 您也可能不希望在每次请求时对jQuery文件运行校验和产生速度惩罚 – 除非您非常偏执。 当然,这样做会消除使用CDN的所有优点。

但假设你只是有点偏执,你可以尝试这样的事情:

  • 确保您引用了Google的jQuery文件的唯一且特定版本。 例如,执行以下操作:

    http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js 

    而不是这个:

     http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js 

    后一版本现在可能会返回1.4.2,但明天会返回1.4.3。 如果您有http和https需求的组合,则可以使用协议相对URL,如下所示:

     //ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js 
  • 最初为此文件生成并存储您自己的校验和。

  • 定期重复该过程,并确保新校验和与旧校验和匹配。 如果没有,请发出喇叭声。

当然,您可以通过编程方式执行此操作。 你决定什么时间间隔有意义。 每一分钟? 每五个? 您现在拥有自动切换开关的材料,其灵敏度可以根据您的喜好进行调整。 “监视器”例程当然不必在您希望保护的应用程序中同步运行; 也许你只是为了这个目的在同一台服务器上运行一个小实用程序。

测试很容易:只需改变存储的哈希值即可。 由于您引用了特定的文件版本,因此每次次要版本更新都不会按下应急按钮。 如果您想要转移到新版本的jQuery,请更改站点上的AJAX API URL并存储新哈希。

正如您的同事所指出的,劫持DNS服务器将是一个问题。 如果您从与您的站点相同的主机上提供库,则不会这样。 但是,如果使用HTTPS,则攻击者不太可能在欺骗站点上拥有有效证书。 我不知道浏览器会如何对此作出反应,但我怀疑他们会将网站标记为不安全(因为某些部分不可信)并采取相应行动。

所以总之; 如果还使用HTTPS访问CDN,则不应存在任何大的风险。

编辑:还要考虑Gert G提到的隐私问题。

从CDN服务jQuery真的不那么安全,而不是从服务器本身服务吗?

是。 如果它是外部资源,它总是不太安全 。 如果您不拥有源代码,您怎么可能确定您知道您的客户真正得到了什么? 如果您不熟悉CloudBleed ,您可能需要在继续之前阅读。

如果出于性能原因需要从外部CDN加载jQuery,请确保使用Subsesource Integrity 。 有关SRI的更多信息可以在MDN上找到。

最后,如果由于网站性能和创建单点故障而安全地通过CDN加载jQuery是一个问题(如果你完全熟悉Steve Souders的工作,那应该是一个问题),你就是几乎可以肯定,从安全性和性能角度来看,更好地将所有脚本移动到内部并使用Fetch Injection并行异步加载它们。 请确保,如果你这样做,那你就是积极的浏览器缓存。 如果您为全球受众群体提供服务,请确保您能够优先缓存这些资产。

如果在网上存在信任,那么谷歌是最值得信赖的……

毫无疑问,谷歌CDN是安全的,但问题总是来自用户/服务器的互联网连接质量。

顺便说一句,如果你将jQuery库包含在谷歌API加载器脚本中,谷歌会在它的CDN可用JavaScript库( 约+ 4kb,参见Firebug )中添加一些小的统计跟踪代码,这使得20kb缩小和压缩的jQuery库有点沉重,加上预见SSL速度。

无论如何缩小/压缩/缓存jQuery这些天不是问题,我建议自己做…