我想通过调用
lua_setfenv()在自己的环境中执行不受信任的.lua文件,这样它就不会影响我的任何代码.
目前运行我使用的文件:
int error = luaL_loadfile(mState,path.c_str()) || lua_pcall(mState,0);
解决方法
请参阅Lua用户的
sandboxing维基的讨论,以及
script security的更一般的主题.这类事情有许多细微而不那么微妙的问题.它可以完成,但是对于诸如i = 1,1e39之类的代码的保护最终需要的不仅仅是限制沙箱可用的功能.
一般技术是为沙盒创建一个功能环境,其中包含允许函数的白名单.在某些情况下,该列表甚至可能是空的,但例如,让用户访问pairs()几乎肯定是无害的.沙箱页面包含系统功能列表,这些功能按其安全性细分,作为构建此类白名单的便捷参考.
然后使用lua_setfenv()将函数环境应用于您加载(但尚未执行)的用户脚本,并根据需要使用lua_loadfile()或lua_loadstring().附加环境后,您可以使用lua_pcall()和朋友执行它.在执行之前,有些人实际上已经扫描了加载的字节码以查找他们不想允许的操作.这可以用于绝对禁止循环或写入全局变量.
另一个注意事项是加载函数通常会加载预编译的字节码或Lua文本.如果你从不允许预编译的字节码,那么结果会更加安全,因为已经发现许多使行为不正常的方法都依赖于手工制作无效的字节码.由于字节码文件以明确定义的非ASCII文本字节序列开头,所以您需要做的就是将脚本读入字符串缓冲区,测试标记的缺失,并将其传递给lua_loadstring(),如果它不是字节码.
多年来在Lua-L mailing list进行了相当多的讨论,所以在那里搜索也可能会有所帮助.