将Lua字符串作为Lua代码执行

7

我希望与同事分享Lua模块。为了获取共享模块的最新版本,我想使用Web服务器存储和获取它们。

我的问题是:

是否可以直接从HTTP请求或字符串加载Lua代码?

我想实现这样的功能:

module = [[
    local sharedModule = {}
    function sharedModule.greet(name) print("hello " .. name) end  
    return sharedModule
]]
greeter = require (module)
greeter.greet("john")

也许这不是正确的做法。还有比这更好的方法吗?

4
你正在寻找load。然而,我建议将这个模块托管在内部,并让用户相应地下载/安装它。 - hjpotter92
@hjpotter92 谢谢你的快速回复。还有感谢你的建议。在访问lua模块之前,我会设置安全检查。 - Lionel Briand
1个回答

9
在《Lua编程》中有一个整个章节专门涵盖了这个。在Lua 5.1及更旧版本中,您可以直接使用loadstring,而在Lua 5.2及更新版本中,则可使用load
不过,我建议您仔细验证实际执行的代码。至少要对其进行版本控制(如果运行的代码取决于环境处于特定状态,则运行错误的版本可能会导致各种问题)。最理想的情况是对代码进行校验和签名,并在执行任何操作之前进行验证。如果您的环境没有得到保护,那么这基本上就是一个巨大的后门。
另外,您还可以使用rings库来隔离您正在运行的代码,在Lua环境内部运行它。尽管安全方面可能不是一气呵成,但如果出现故障,它至少可以防止接收到的代码崩溃您的应用程序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接