2010-08-15 52 views
21

我们建立具有公共(非安全)区域并且安全(通过HTTPS传送)区域的网站,并使用jQuery库。交付jQuery的CDN安全性如何?

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

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

看来,谷歌CDN支持通过SSL服务图书馆。

从CDN服务jQuery确实不太安全,然后从服务器本身提供服务?这种威胁有多严重?

+4

有参与以及一个隐私问题,因为谷歌将能够知道哪些用户是去你的网站。 – 2010-08-15 21:44:16

+1

@Gert - 他们可能会知道,用户访问的网站越多,从CDN获取的文件也越多,他们就越不可能通过您的网站访问Google。 – 2010-08-15 22:02:10

+0

@Nick - 只要用户不刷新页面(例如通过刷新按钮,CTRL-R或CTRL-F5)。 – 2010-08-15 22:26:04

回答

6

缓解风险的一种方法是针对从Google获得的文件运行校验和,并将其与您拥有的已知良好校验和进行比较。

为了回应Google是否以任何方式修改这些文件的问题,Google的员工Ben Lisbakken suggested comparing MD5 checksums将Google提供的文件添加到从其维护人员主网站获得的同一文件的规范版本中。阅读链接网站上的评论八以了解上下文。

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

不过,假设你只有有些偏执,你可以尝试这样的事:

  • 确保您引用从谷歌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需求的组合,你可以使用相对协议网址,例如:

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

  • 定期重复这一过程,并确保新的校验和相匹配的旧的。如果没有,听起来很棒。

您可以通过编程做到这一点,当然。你决定什么时间间隔有意义。每一分钟?每五个?您现在拥有自动关闭开关的灵敏度,您可以根据自己的喜好调整灵敏度。 “监视器”程序当然不必在您希望保护的应用程序内同步运行;也许你只是为了这个目的在同一台服务器上运行一个小型实用程序。

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

+0

由于IE中的错误,协议相对URL不好用,它会下载相对引用的文件两次:http://www.stevesouders.com/blog/2010/02/10/5a-missing-schema-double -download/ – calvinf 2010-08-23 22:09:55

+1

啊,IE,一如既往地呼吸新鲜空气。但是,这个问题似乎只能扩展到样式表。从参考页面:*“事实证明,这只发生在样式表中。缺失模式,我创建的双重下载测试页面包含样式表,图像和脚本,它们都具有协议相关URL ...样式表被下载两次,但图像和脚本只下载一次。“* – 2010-08-23 23:47:08

+0

这是一种子资源完整性检查的形式。有关执行SRI的标准方式的更多信息[可在MDN上获得](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity)。 – 2017-04-15 12:19:09

1

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

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

编辑:也考虑由提到的隐私问题格特G

+0

你说如果图书馆是从与该网站相同的服务器提供服务,这不是问题。但是,如果他能够劫持DNS,那么他也可以在网站的其他部分玩中间人。 – Dan 2010-08-16 13:55:47

+0

但是,如果他被劫持*你的* DNS记录,整个网站是不可信的,无论你在哪里得到你的jQuery库。这个问题不再与CDN有关。 – You 2010-08-16 15:16:42

+0

好吧,正是我的观点。如果他劫持DNS服务器,他可以劫持我的DNS记录。最后,CDN还是不CDN,安全性是一样的。 – Dan 2010-08-18 18:34:28

-3

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

毫无疑问,谷歌CDN是安全的,但问题始终始终从用户/服务器的互联网连接质量来。顺便说一句,如果您将jQuery库包含Google API加载器脚本,Google会将一些小型统计跟踪代码添加到CDN可用的JavaScript库(约+ 4kb,参见Firebug),这会使20kb缩小并压缩jQuery库有点沉重,并预见SSL速度。

反正缩小文件/压缩/缓存jQuery是没有问题的,这些天,我建议让自己的...

+5

Google CDN版本的JavaScript库不包含跟踪代码。官方网站上的jQuery版本与来自CDN的Google主机完全相同。 – 2010-08-24 16:21:39

+1

如果您使用Google API加载器脚本包含jQuery库,它将... 然后google.load('jquery','1.4.2'); – Otar 2010-08-25 08:31:39

+0

我提出了一个编辑此答案的建议,以便让其他用户更清楚地知道,跟踪只发生在Google API加载器上,正如原始作者在下面评论中的注释。这绝对可以证实,虽然发生?谷歌是否真的跟踪使用它的装载机? – redfox05 2015-07-01 08:39:59

1

从CDN真的不太安全服务的jQuery然后从服务器本身的服务呢?

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

如果您出于性能原因需要从外部CDN加载jQuery,请确保您使用的是子源代码完整性。有关MDN上的SRI can be located的更多信息。

最后,如果通过CDN安全加载jQuery是由于网站性能的关注和失败的单点的创建(它应该是一个问题,如果你在所有熟悉史蒂夫的工作Souders),从安全性和性能角度来看,您几乎可以更好地使用Fetch Injection将所有脚本内部并行加载并异步并行加载。只要确定,如果你这样做,你就积极地浏览器缓存。如果您为全球用户服务,请确保您在边缘缓存这些资产。