【问题标题】:I need to run untrusted server-side code in a web app - what are my options?我需要在 Web 应用程序中运行不受信任的服务器端代码 - 我有哪些选择?
【发布时间】:2015-03-06 16:22:40
【问题描述】:

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

所以我需要执行通过 Web 界面输入的任意代码字符串(某种临时插件 - 语言无关紧要)。我已经了解到,对 Python 进行正确的沙箱处理几乎是不可能的,所以这是没有选择的。

到目前为止,我已经查看了 Lua,发现了 Lupa、Lunatic Python 和 Lupy,但它们都允许访问 Python 运行时的部分内容。

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

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

【问题讨论】:

  • 是否需要使用python?仅使用 lua 并从 vm 环境中删除“危险”功能怎么样?这个问题也可能与stackoverflow.com/questions/17454263/…有关。
  • @greatwolf 不受信任的代码可以是任何合适的语言。感谢您的链接,但我无法尝试,因为 Lupa 仍然拒绝安装在我的开发机器上。我采用了 JS 方式,它已经可以工作,但存在重大安全问题。

标签: python lua eval sandbox


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    还有一个在线沙盒:https://sneklang.functup.com

    我专门做了这个项目,因为我有同样的要求。

    猜你喜欢
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 2013-08-16
    相关资源
    最近更新 更多