Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以安全的方式执行第三方javascript(由某些数据库提供)_Javascript_Jslint_Google Caja - Fatal编程技术网

以安全的方式执行第三方javascript(由某些数据库提供)

以安全的方式执行第三方javascript(由某些数据库提供),javascript,jslint,google-caja,Javascript,Jslint,Google Caja,我正在构建一个应用程序,其中用户生成的javascript函数存储在数据库中,并作为回报提供给许多其他用户。 脚本必须由具有管理员权限的人员进行验证(该人员应该是可信任的,但它们是由用户自己选择的,因此似乎有必要进行验证) 将要执行的函数是主要的,仅用于计算目的-不需要访问DOM或任何全局对象(至少目前是这样) 假设一个用户定义了一个计算字符串单词数的函数(作为一个简单的例子) 目前我的方法是将函数封装在闭包中,传递一个具有输入属性的对象,并在其中定义一个局部var窗口,以使这个全局对象不可访问

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

将要执行的函数是主要的,仅用于计算目的-不需要访问DOM或任何全局对象(至少目前是这样)

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

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

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

下一种方法是使用类似于Caja的东西(事实上,这将消除轻松添加新函数的可能性,因为javascript代码必须“转换”为代码的Caja版本(这是我自己的应用程序无法即时完成的)

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


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

我不知道这是否是您试图避免的方法,但我只想以
的方式执行Javascript

使用一个iframe加载一个只附加了所需Javascript的页面,您的所有沙箱都将为您处理

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

下一种方法是使用类似于Caja的东西(事实上,这将消除轻松添加新函数的可能性,因为javascript代码必须“转换”为代码的Caja版本(这是我自己的应用程序无法即时完成的)


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

感谢您的回复!我如何为尚未定义的函数编写测试?这些测试如何防止执行可能有害的代码(例如,通过访问全局范围)?考虑提供定义参数的功能(任何参数都没有)和预期的结果。所以你不是在编写测试,你只是提供了一个框架。你的想法听起来很有趣-尽管我不得不承认我不知道如何实现这一点(目前我正在使用QUint进行测试)。你对测试函数字符串执行一些正则表达式有何想法(这些函数实际上存储在一种HashMap中)?我是否需要测试eval()、window、、document之类的东西的使用?我担心这样做会导致遗漏一些重要的安全漏洞。但我可能理解你的错误(很可能我也缺乏必要的知识…)关于这一点,matthiasI将尝试更仔细地研究这里给出的两种方法,并且(很可能)稍后再来。现在我非常感谢你们两人的奉献和帮助——看来我没有必要的权利嘲笑你们两人的努力(由于我不能100%确定所提供的答案是我问题的实际解决方案,尽管我确信它指向了正确的方向,但如果其他寻求类似解决方案的人将其标记为正确答案,则似乎是不公平的).再次:感谢你们两位。感谢你们的想法!我确实考虑过这种方法,但我有点认同这样一个事实,即使用iFrame(据我所知)并不能防止偷饼干(不久前读过)全局范围的访问-你对此有什么想法吗?尊敬的,Matthiasys,好的一点-这两个问题都可能是安全问题。解决这个问题的最好方法是将iframe页面放在不同的域或子域上。这样,浏览器将使用单独的cookie并拒绝访问window.parent对象。我将升级我接受了我的答案。这种方法的问题(尽管它很可能是一个非常好的方法——考虑到它将为执行的代码提供最大的灵活性)是函数存储在一种hashmap(作为字符串)中。我通过这样做(…=新函数(param,code)…)来调用它们-这意味着我必须动态创建一个iframe(通过jquery,…),这意味着它将由我的基本域中的代码创建,因此可以访问所有it功能(安全问题将持续存在)-有什么想法吗?-关于,matthias