在很多扩展中常见的用法是使用XMLHttpRequest(或者其他机制)从一个远程的网站下载 JavaScript 或者JSON(这两者是不同的!)一旦内容下载完成,扩展的作者就会使用 eval()
继续进行解码的工作,把字串内容转换成 JavaScript 对象。这样的做法是非常危险的,并且,实际上不会通过AMO的审核。所以这样的扩展将不会被允许离开AMO的砂箱。
这种做法是危险的是因为解码后的 JavaScript 具有全部的 chrom 权限并且可以执行一些很恶劣的动作.一个扩展下载下来的JavaScript如何能执行恶劣的动作?如果承载 JavaScript 的网络服务器被劫持了或者被攻陷了,那就很容易了。这种情况是有可能发生的。AMO很认真地看待这种危险。
好消息是我们有很多方法来绕开这个问题。
下载 JSON
如果扩展是需要下载JSON,那么开发人员应该使用在这里讨论过的某种JSON解码方法,而千万不要使用eval()
。JSON是有关状态的,并不允许解码函数。扩展开发人员可用的JSON解码方法保护了扩展免于受到恶意的JSON和JavaScrip的侵害。从远端的服务器通过JSON下载状态变得日益流行。使用JSON解码器,而不是eval()
!
下载 JavaScript
当然了,有时候也有扩展中下载并插入 JavaScript 代码模块的时候。发生这些事情主要是因为扩展试图保持它的部分代码是干净和动态的,而扩展的作者又不想为每次脚本的变化发布一个新版本。在这种场合下,我们应该使用 JavaScript 的砂箱来把下载下来的JavaScript代码和扩展的其它代码部分以及宿主的应用给隔离开。
砂箱是通过使用Components.utils.evalInSandbox()
实现的。JavaScript 代码会被和任何JavaScript需要交互的"安全"的对象一起添加到砂箱里。砂箱自己也不是完全没有危险,开发者应该仔细阅读砂箱的文档页面,以确保不可信的代码不会从砂箱中泄露出来。