我想在应用程序中提供最终用户脚本(将在服务器端运行)。我一直在阅读,发现沙盒比我想象的要严重得多。
我真的不在乎什么语言是什么。 LUA、Python、JavaScript,我可以接受任何可读的内容。
在不受信任的脚本中运行一个函数,传递一些信息并获取更多信息有多难?我读过 JVM Security Manager is a no-go 和 Python is nearly unsandboxable,但我对这个主题知之甚少,无法真正判断来源。
例如,我如何解释 JS 中接受 JSON(例如来自 Java、Python,甚至 node.js)的函数,并取回返回的 JSON?
我想避免自己实现一个 pythonish i-just-know-it-will-suck 语言解释器。
最佳答案
Lua 具有良好的沙箱功能并且干净简单。
它有 setfenv()可以在特定环境中运行代码的功能。不受信任的代码只能访问特定环境中的内容。
对于 C 函数,例如 string.rep
,您可以通过将它们替换为 Lua 函数或为 lua_newstate
提供自定义内存分配器来防止内存过度消耗。
此外,如果您决定希望将 Lua 用于可信代码并让它与不受信任的代码交互,您可以使用 coroutines和 debug.sethook
控制 CPU 使用率。
Lua Wiki 有一个简单的 example sandbox .
source code的 lua live demo可能也很有趣。
关于javascript - 最终用户脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10142236/