我们构建具有公共(非安全)区域和安全(通过HTTPS提供)区域的站点,并使用jQuery库。
最近我建议我们使用Google CDN进行jQuery交付。我的一些同事对这种提供JavaScript库的方式的安全方面表示了担忧。
例如,他们提到有人可能会劫持DNS服务器,然后注入恶意修改的库,为不同的安全攻击打开大门。 现在,如果黑客可以通过谷歌CDN注入恶意代码,那么如果从网站本身提供jQuery,他可能会做同样的事情,对吗?
谷歌CDN似乎支持通过SSL提供服务。
从CDN提供jQuery是否真的不那么安全,从服务器本身提供它?这种威胁有多严重?
答案 0 :(得分:6)
降低风险的一种方法是对从Google获取的文件运行校验和,并将其与已经拥有的已知良好校验和进行比较。
在回答有关Google是否以任何方式更改这些文件的问题时,Google员工Ben Lisbakken suggested comparing MD5 checksums将Google提供的文件提供给从其维护者主页获得的同一文件的规范版本。阅读链接网站上的评论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并存储新哈希。
答案 1 :(得分:1)
正如您的同事指出的那样,劫持DNS服务器将是一个问题。如果您从与您的站点相同的主机提供库,则不会。但是,如果使用HTTPS,则攻击者不太可能在欺骗性站点上拥有有效证书。我不知道浏览器会对此做出怎样的反应,但我怀疑他们会将网站标记为不安全(因为某些部分不可信)并采取相应行动。
总之;如果还使用HTTPS访问CDN,则不应存在任何大的风险。
修改:还要考虑 Gert G 提到的隐私问题。
答案 2 :(得分:1)
从CDN提供jQuery是否真的不那么安全,而不是从服务器本身提供它?
是。如果它是外部资源,则始终不太安全。如果您不拥有源代码,您怎么可能确定您知道您的客户真正得到了什么?如果您不熟悉 CloudBleed ,您可能需要在继续之前阅读。
如果出于性能原因需要从外部CDN加载jQuery,请确保使用 Subsesource Integrity 。有关MDN上的SRI can be located的更多信息。
最后,如果由于网站性能和创建单点故障而安全地通过CDN加载jQuery是一个问题(如果你完全熟悉它应该是一个问题在Steve Souders的工作中,从安全性和性能角度来看,你几乎肯定会更好地将所有脚本移到内部并使用Fetch Injection并行地异步加载它们。请确保,如果你这样做,你就是积极的浏览器缓存。如果您为全球受众群体提供服务,请确保您能够优先缓存这些资产。
答案 3 :(得分:-3)
如果在线存在信任,那么谷歌是最值得信赖的......
毫无疑问,Google CDN是安全的,但问题始终始终来自用户/服务器的互联网连接质量。
顺便说一句,如果你将jQuery库包含在谷歌API加载器脚本中,谷歌会在它的CDN可用JavaScript库(约+ 4kb,参见Firebug )中添加一些小的统计跟踪代码。 20kb缩小和压缩的jQuery库有点沉重,加上预见SSL速度。
无论如何缩小/压缩/缓存jQuery这些天不是问题,我建议自己制作......