微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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进行了相当多的讨论,所以在那里搜索也可能会有所帮助.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐