我需要在 Web 应用程序中运行不受信任的服务器端代码 - 我有哪些选择?

I need to run untrusted server-side code in a web app - what are my options?

# 上下文——如果你想直截了当地跳过
我一直在 Python (Bottle/gevent/MongoDB) 中构建一个相当复杂的 Web 应用程序。它是一个 RSVP 系统,它允许多个独立的带有注册表单的前端实例以及具有精细用户权限的后端访问(这些用户是我们的客户)。我现在需要实现一个灵活的 map-reduce 引擎来收集注册数据的统计信息。一种放之四海而皆准的解决方案是不可能的,因为收集的数据因实例而异。我还想为我们更倾向于技术的客户保持开放。
# 上下文结束

所以我需要执行通过网络界面输入的任意代码字符串(某种临时插件 - 语言无关紧要)。我已经知道要正确地沙箱 Python 几乎是不可能的,所以那是别无选择。

截至目前,我已经调查了 Lua 并找到了 Lupa、Lunatic Python 和 Lupy,但这三个都允许访问 Python 的部分内容运行时间。

还有 PyExecJS 及其各种运行时(V8、Node、SpiderMonkey),但我不知道它是否会带来任何安全风险。

问题:
1. 有谁知道另一个(更合适的)选项吗?
2. 对于那些熟悉任何 Lua 绑定的人:是否有可能使它们完全安全而没有太多麻烦?
3. 对于熟悉 PyExecJS 的人:它有多安全?另外,我应该期待什么样的性能,比如说,调用一个短映射函数 1000 次,然后迭代一个 1000 项列表?

您可以通过以下几种方式运行不受信任的代码:

  • 一个 docker 包含 运行 代码的容器,我建议检查 codecube.io ,它完全符合您的要求,您可以了解更多关于该过程的信息 here
  • 使用 libsandbox libraries 但目前文档非常糟糕
  • PyPy 的沙盒

Sneklang 是 Python 的严格子集,可以在您提供的范围内安全评估。

它受范围大小和节点评估步骤数的限制,并防止无限循环、堆栈溢出和过度内存使用。

还有在线沙箱:https://sneklang.functup.com

我特地做了这个项目,因为我有相同的要求。