限制第三方脚本 - 谷歌Caja?

时间:2013-10-15 10:19:16

标签: javascript sandbox google-caja

我正在构建一个CMS系统,我想限制用户可以嵌入其网站的第三方JavaScript包含。

我将使用跟踪作为示例场景,因为它最好地描述了我想要实现的目标。

  1. 我创建了一份授权脚本的白名单(即Google Analytics,Optimizely)
  2. 用户输入新脚本并且它不在白名单上,即Tableau,并且核心功能将被阻止/限制/减少。
  3. 定义“已阻止”:脚本无法与页面上的任何元素交互(即监视表单元素并从提交的表单中捕获数据)或用户访问数据被混淆且根本无用的。

    因此,考虑到上面的示例,我希望可以减少Tableau的功能。 Heatmap报告之类的东西将不再起作用(因为我们阻止与DOM的交互,客户端事件不应该起作用)。另外我假设看看Caja的架构,访问似乎来自Cajoled服务,而不是来自用户浏览器?

    看看谷歌Caja似乎可能是它的选择,但重点始终是整个HTML / CSS / JS(一个小工具/应用程序),我在寻找的东西在这个意义上略有减少。也许有另一种解决方案

    是否可以将其设置为通用,或者是否需要针对每个白名单/黑名单项目进行特定工作?

    编辑 - 看一下,有各种类型的沙盒脚本可用,但它们看起来都相对不受支持或处于开发的每个生产阶段。

    JSandbox https://github.com/eligrey/jsandbox

    JS.js https://github.com/jterrace/js.js

1 个答案:

答案 0 :(得分:2)

Caja不会“开箱即用”地完成你想要的所有内容,但它很有可能为你的沙盒提供有用的组件。

Caja本身并不支持你提出的“白名单脚本”模型;指导原则是任何代码都不应该比它需要的“信任”更多,因此我们专注于基于程序的预期用途而不是作者的授权。如果你想要一个全页面访问脚本的白名单,那么你需要自己构建,但这不是一个复杂的问题,并且可能需要与你的CMS紧密集成。

现在,支持运行具有“减少”功能的脚本是Caja 可以帮助的。但是,目前还不清楚你想要什么样的减少。

  • 如果您只想运行代码并获取数据输入/输出,那么只需SES即可轻松处理; Caja中的所有沙盒代码都是在SES下自动运行的,或者如果它适合您的应用程序,您可以加载没有Caja的SES,重量稍轻但需要更多地了解如何编写功能安全的JavaScript。

    (这也是你提到的其他JS沙箱所填写的角色。与你提到的其他选项相比,SES可能(我没有详细查看过)可以更容易地支持与沙盒的密切交互。代码,例如函数调用两种方式,不涉及异步回调。)

  • 如果您想提供对简单API的过滤访问,那么Caja可以使用“驯服”工具轻松完成。

  • 另一方面,如果您想向现有网页的DOM 提供有限的访问权限,那么Caja没有为您准备任何内容,但可能会针对此目的进行修改。正如您已经注意到的那样,Caja的DOM驯服层专注于为沙盒代码提供对页面片段的完全控制,而不是访问整个页面的选定方面。这样做需要一些修改。 (如果感兴趣的话,一个特别容易支持的案例是提供对整个页面的只读访问; Caja支持这个以满足自己的需求,但是没有碰巧是一种公开的方式来询问它。)

如果您仍然对使用Caja感兴趣,我建议您开始讨论google-caja-discuss,并准确描述您希望支持哪种缩减功能。

免责声明:我在Google上为Caja项目工作,但这篇文章完全是我自己的观点和意见。