c – 如何从C API在自己的环境中执行不受信任的Lua文件

我想通过调用 lua_setfenv()在自己的环境中执行不受信任的.lua文件,这样它就不会影响我的任何代码.

功能的文档虽然只解释了如何调用函数,而不是如何执行文件.

目前运行我使用的文件

int error = luaL_loadfile(mState,path.c_str()) || lua_pcall(mState,0);

我是否必须使用lua_setfenv从C API调用“dofile”lua函数,或者是否有更优雅的方法来执行此操作?

解决方法

请参阅Lua用户sandboxing维基的讨论,以及 script security的更一般的主题.这类事情有许多细微而不那么微妙的问题.它可以完成,但是对于诸如i = 1,1e39之类的代码的保护最终需要的不仅仅是限制沙箱可用的功能.

一般技术是为沙盒创建一个功能环境,其中包含允许函数的白名单.在某些情况下,该列表甚至可能是空的,但例如,让用户访问pairs()几乎肯定是无害的.沙箱页面包含系统功能列表,这些功能按其安全性细分,作为构建此类白名单的便捷参考.

然后使用lua_setfenv()将函数环境应用于您加载(但尚未执行)的用户脚本,并根据需要使用lua_loadfile()或lua_loadstring().附加环境后,您可以使用lua_pcall()和朋友执行它.在执行之前,有些人实际上已经扫描了加载的字节码以查找他们不想允许的操作.这可以用于绝对禁止循环或写入全局变量.

一个注意事项是加载函数通常会加载预编译的字节码或Lua文本.如果你从不允许预编译的字节码,那么结果会更加安全,因为已经发现许多使行为不正常的方法都依赖于手工制作无效的字节码.由于字节码文件以明确定义的非ASCII文本字节序列开头,所以您需要做的就是将脚本读入字符串缓冲区,测试标记的缺失,并将其传递给lua_loadstring(),如果它不是字节码.

多年来在Lua-L mailing list进行了相当多的讨论,所以在那里搜索也可能会有所帮助.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...