【问题标题】:executing third party javascript (served from some DB) in a safe way以安全的方式执行第三方 javascript(从某些数据库提供)
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的想法!我实际上已经考虑过这种方法,但我有点相信这样一个事实,即使用 iframe 确实(据我所知)不会阻止例如cookie 的窃取(前段时间读过)和全局范围的访问——你对此有什么想法吗?问候,马蒂亚斯
  • 是的,好点 - 这两个问题都可能是安全问题。解决此问题的最佳方法是将 iframe 页面放在不同的域或子域上。这样浏览器将使用单独的 cookie 并拒绝访问 window.parent 对象。我会更新我的答案。
  • 我对这种方法的问题(尽管它很可能是一个非常好的方法 - 考虑到它将为执行的代码提供最大的灵活性)是函数存储在一种哈希图(作为字符串)。我通过做这样的事情来调用它们 (... = new Function(param, code) ...) - 这意味着我必须即时创建一个 iframe(通过 jquery,...),这意味着它将由我的基本域中的代码创建,因此可以访问它的所有功能(并且安全问题将持续存在)-对此有什么想法吗? - 问候,马蒂亚斯
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 2017-05-23
    相关资源
    最近更新 更多