【发布时间】:2012-01-31 15:05:24
【问题描述】:
我正在构建一个应用程序,其中用户生成的 javascript 函数存储在数据库中,并作为回报提供给许多其他用户。 脚本必须由具有管理员权限的人进行验证(他们应该是可信任的 - 但它们是由用户自己选择的,因此似乎有必要进行某种验证)
将被执行的函数主要用于计算目的 - 不需要访问 DOM 或(至少目前)任何全局对象。
假设用户定义了一个计算字符串单词的函数(作为一个简单的例子)。
我目前的方法是将函数包装在一个闭包中,传递一个带有输入属性的对象并在其中定义一个本地 var 窗口以使这个全局对象不可访问(显然这还不够 - 遍历所有属性窗口对象并在本地定义它们可能是一种可能性,但作为回报可能会破坏一些重要的功能,这还不够)
下一个想法是在 ADsave 调用中即时包装该函数,以防止可能有害的功能(以及对全局范围的访问),但这需要通过 JSLint / adsave 选项验证代码 -苍蝇(我只是找不到任何关于如何做到这一点的材料......!)
下一个方法是使用 Caja 之类的东西(实际上这将消除轻松添加新功能的可能性,因为 javascript 代码必须“转换”为代码的 Caja 版本(这不能由我的即时拥有自己的应用程序)。
因为每当函数从服务器返回时(不仅仅是在客户端上创建函数时),我都必须对其进行验证,因此 ADsave 似乎是迄今为止最好的解决方案
是否有人对上述问题有解决方案(或者可能是更好的解决方案 - 我的意思是,以安全的方式执行第三方 jscript(从某些数据库提供)现在应该是一项相当普遍的任务。
【问题讨论】:
-
感谢您的回复!我将如何为尚未定义的函数编写测试?这些测试将如何防止执行可能有害的代码(例如通过访问全局范围)?
-
考虑提供功能来定义参数(任何参数)和预期结果。所以你不是在编写测试,你只是在提供一个框架。
-
你的想法听起来很有趣——尽管我不得不承认我不确定如何实现它(目前我正在使用 QUInt 进行测试)。您是否对在函数字符串上执行一些正则表达式进行测试(这些函数实际上存储在一种 HashMap 中)?我是否必须测试 eval()、window. , 文档。和类似的东西?我担心这样做会确保我错过一些重要的安全漏洞。但可能我理解你的赞扬是错误的(我很可能也缺乏必要的知识......)问候,马蒂亚斯
-
我将尝试仔细研究这里给出的两种方法,并且(很可能)稍后再返回。现在,我要感谢你们俩的奉献和帮助——我似乎缺乏必要的权利来赞扬你们俩的努力(而且我不能 100% 确定所提供的答案是实际的解决方案对于我的问题,尽管我很肯定它指向正确的方向,但对于其他寻求类似解决方案以将其标记为正确答案的人来说似乎是不公平的)。再次感谢你们俩。
标签: javascript jslint google-caja