【问题标题】:End-user scripting最终用户脚本
【发布时间】:2012-04-13 13:58:42
【问题描述】:

我想在应用程序中提供最终用户脚本(将在服务器端运行)。我一直在阅读,发现沙盒比我想象的要严重得多。

我真的不在乎 语言是什么。 LUA、Python、JavaScript,任何可读的东西我都可以。

在不受信任的脚本中运行函数、传递一些信息并获取更多信息有多难?我读过 JVM Security Manager is a no-go 并且 Python 几乎是不可沙盒化的,但我对该主题知之甚少,无法真正判断来源。

例如,我如何在 JS 中解释一个接受 JSON(例如来自 Java、Python 甚至 node.js)的函数,并取回返回的 JSON?

我想避免自己实现一个 pythonish i-just-know-it-will-suck 语言解释器。

【问题讨论】:

  • JavaScript 似乎是这里最安全的选择。它基本上就是为此目的而设计的。
  • 对于 Python 沙盒,有 some advice
  • @Lattyware:保护 CPython 的建议基本上没有用,恕我直言。他们推荐 chrooting(这是不安全的)和虚拟化(这是昂贵的)。
  • LUA 在嵌入方面取得了很大的成功,部分原因在于它对内存的要求较低,而且您可以轻松删除所有不需要的部分。
  • @NiklasB。这是真的,但显然 Jython 可能会起作用。我承认它可能不是最适合它的。

标签: javascript python lua sandbox


【解决方案1】:

Lua 具有良好的沙盒功能,并且干净简单。

它具有setfenv() 功能,可以在特定环境中运行代码。不受信任的代码只能访问特定环境中的内容。
对于 C 函数,例如 string.rep,您可以通过将它们替换为 Lua 函数或为 lua_newstate 提供自定义内存分配器来防止内存过度消耗。

另外,如果您决定将 Lua 用于受信任的代码并让它与不受信任的代码交互,您可以使用 coroutinesdebug.sethook 来控制 CPU 使用率。

Lua Wiki 有一个简单的example sandbox
lua live demosource code 可能也很有趣。

【讨论】:

  • 感谢推荐和参考!我四处阅读,并决定我会带着这个去看看它会把我引向何方。看起来很棒!
【解决方案2】:

Tcl 有一个非常强大的 sanbox 模型,并且可以说是用于最终用户脚本的更好的语言之一。您可以在 safe interpreter 手册页上阅读更多相关信息。

【讨论】:

    猜你喜欢
    • 2017-04-16
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    相关资源
    最近更新 更多