我们构建的网站具有公共(public)(非安全)区域和安全(通过 HTTPS 交付)区域,并且我们使用 jQuery 库。
最近我建议我们使用 Google CDN 进行 jQuery 交付。我的一些同事对这种交付 JavaScript 库的方式的安全性表示担忧。
例如,他们提到有人可能劫持 DNS 服务器,然后注入(inject)恶意修改的库,从而为不同的安全攻击打开了大门。 现在,如果黑客可以通过 Google CDN 注入(inject)恶意代码,那么如果网站本身提供 jQuery,他也可能会做同样的事情,对吗?
Google CDN 似乎支持通过 SSL 提供库。
从 CDN 提供 jQuery 真的不如从服务器本身提供服务安全吗?这种威胁有多严重?
最佳答案
降低风险的一种方法是对从 Google 获取的文件运行校验和,并将其与您已经拥有的已知良好的校验和进行比较。
在回答有关 Google 是否以任何方式更改这些文件的问题时,Google 员工 Ben Lisbakken suggested comparing MD5 checksums Google 提供的文件的规范版本与从其维护者主页获取的同一文件的规范版本。请阅读链接网站上的评论八了解上下文。
如果您担心 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,则可以使用协议(protocol)相关 URL,如下所示:
//ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js
最初为此文件生成并存储您自己的校验和。
- 定期重复该过程,并确保新的校验和与旧的校验和匹配。如果没有,请鸣响喇叭。
当然,您可以通过编程来完成此操作。您决定什么间隔才有意义。每一分钟?每五个?您现在已经具备了自动终止开关的条件,您可以根据自己的喜好调整其灵敏度。 “监视”例程当然不必在您希望保护的应用程序中同步运行;也许您只是出于此目的在同一服务器上运行一个小型实用程序应用程序。
测试起来很容易:只需更改存储的哈希值即可。由于您引用的是特定文件版本,因此每次次要版本更新时都不会按下紧急按钮。当您确实想要迁移到新版本的 jQuery 时,请更改站点上的 AJAX API URL 并存储新的哈希值。
关于jquery - CDN 交付 jQuery 的安全性如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3489344/