2

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

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

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

我目前的方法是将函数包装在一个闭包中,传递一个带有输入属性的对象并在其中定义一个本地 var 窗口以使这个全局对象不可访问(显然这还不够 - 遍历窗口的所有属性对象并在本地定义它们可能是一种可能性,但作为回报可能会破坏一些重要的功能,这还不够)

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

下一个方法是使用 Caja 之类的东西(实际上这将消除轻松添加新功能的可能性,因为 javascript 代码必须“转换”为代码的 Caja 版本(这不能由我自己的应用程序在-苍蝇)。

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

有没有人有解决上述问题的方法(或者可能是更好的解决方案——我的意思是,以安全的方式执行第三方 jscript(从某些数据库提供)现在应该是一项相当普遍的任务。

4

2 回答 2

1

我不知道这是否是您要避免的方法,但我会简单地在<iframe>.

使用 iframe 加载仅附加了所需 Javascript 的页面,您的所有沙盒操作都会为您处理好。

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

于 2012-02-01T09:26:14.917 回答
1

下一个方法是使用 Caja 之类的东西(实际上这将消除轻松添加新功能的可能性,因为 javascript 代码必须“转换”为代码的 Caja 版本(这不能由我自己的应用程序在-苍蝇)。

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

于 2013-02-14T17:45:18.347 回答