通过loadstring在Lua中运行不受信任的代码

通过loadstring在Lua中运行不受信任的代码,lua,Lua,我正在为一个游戏使用一个modding api,对于那些好奇的人来说,这是factorio,但它并不是真正相关的,Lua环境非常有限,阻止了像setfenv这样的函数,这是一个5.1环境,我确实可以访问loadstring,pcall,等等。我的问题是,您建议如何运行用户提供的“不安全”代码,并限制用户在不访问环境修改功能的情况下可以访问哪些功能?(最好是白名单函数/值,而不是黑名单,但我会尽我所能)在Lua5.1中,您需要setfenv来创建一个安全的沙盒(参见典型过程)。所以如果你不能接触到

我正在为一个游戏使用一个modding api,对于那些好奇的人来说,这是factorio,但它并不是真正相关的,Lua环境非常有限,阻止了像
setfenv
这样的函数,这是一个5.1环境,我确实可以访问loadstring,pcall,等等。我的问题是,您建议如何运行用户提供的“不安全”代码,并限制用户在不访问环境修改功能的情况下可以访问哪些功能?(最好是白名单函数/值,而不是黑名单,但我会尽我所能)

在Lua5.1中,您需要setfenv来创建一个安全的沙盒(参见典型过程)。所以如果你不能接触到塞芬夫,我认为这是不可能的


同样,如果您正在使用的环境禁用了setfenv,并在loadstring周围放置了一个包装器以避免恶意字节码加载(同样,请参阅我链接的答案),那么您可能可以运行脚本,而无需为其设置特殊环境。安全与否取决于您当前环境的详细信息。

我很抱歉回答得太晚(您现在可能已经离开了),但可以使用内置的加载功能来实现这一点。您可以为该函数提供第四个参数,该函数是一个自定义环境,它将返回一个函数。你可以传递一个函数,一个字符串,甚至一个线程(我想)来加载并得到你想要的结果。我也遇到了这个问题,我想我会为未来的用户解答这个问题

以下是指向lua站点上用于加载的文档的链接:
我已经对其进行了测试,以确保它在Factorio中正常工作,并且似乎能按预期工作。

如果您愿意严重牺牲性能,可以使用几种Lua-in-Lua模拟器。()