以安全的方式执行第三方javascript(从某些DB提供)

时间:2012-01-31 15:05:24

标签: javascript jslint google-caja

我正在构建一个应用程序,其中用户生成的javascript函数存储在数据库中,作为回报,它被提供给许多其他用户。 脚本必须由具有管理员权限的人验证( 应该是可信任的 - 但是他们是由用户自己选择的,因此似乎需要一种验证)

将要执行的函数仅用于计算目的 - 无需访问DOM或(至少在此时)任何全局对象都需要。

假设用户定义了一个计算字符串单词的函数(作为一个简单的例子)。

我现在的方法是将函数包装在一个闭包中,传递一个带有输入属性的对象,并在其中定义一个局部var窗口,使这个全局对象不可访问(显然这还不够 - 迭代所有属性窗口对象并在本地定义它们可能是一种可能,但反过来可能会破坏一些重要的功能,但这还不够。)

接下来的想法是即时将函数包装在ADsave调用中以防止可能有害的功能(以及访问全局范围),但这需要通过JSLint / adsave选项验证代码 - 飞 - (我找不到任何有关如何做的材料......!)

接下来的方法是使用像Caja这样的东西(这实际上可以消除轻松添加新功能的可能性,因为javascript代码必须'转换'到代码的Caja版本中(这是我无法完成的)自己动态申请。

因为我必须在从服务器返回函数时验证函数(不仅仅是在客户端上创建函数时),ADsave似乎是迄今为止最好的解决方案

有没有人能解决上面提到的问题(或者可能是一个更好的解决方案 - 我的意思是以安全的方式执行第三方jscript(从某些数据库提供)应该是一个非常常见的任务。

2 个答案:

答案 0 :(得分:1)

我不知道这是否是您试图避免的方法,但我只是在<iframe>中执行Javascript。

使用iframe加载只附加了所需Javascript的页面,并为您处理所有沙盒。

修改 - 正如本回答的评论中所述,为了防止iframe中的脚本访问父文档,您可以在子域上托管iframe页面。这样浏览器将使用单独的cookie并拒绝访问window.parent对象。

答案 1 :(得分:1)

  

接下来的方法是使用像Caja这样的东西(这实际上可以消除轻松添加新功能的可能性,因为javascript代码必须'转换'到代码的Caja版本中(这是我无法完成的)自己动态申请。

在现代浏览器(具有足够正确的ECMAScript 5标准实现的浏览器)上,Caja不需要执行内容的主要转换,并且可以完全以客户端方式运行,包括支持{{1 }}