使用LuaJIT进行脚本编写并选择性地对FFI进行沙盒保护。
2013-8-22 10:16:4
收藏:0
阅读:69
评论:1
在尝试并亲身见证了我能够轻松地将Lua和LuaJIT集成到我的游戏引擎中之后,我相信这是我想使用的脚本语言。我想将其用于我的AI、单位描述、地图触发器等(尽可能多的使用它)。这个问题不仅适用于游戏开发,我可以想象创建一个可脚本化的编辑器或窗口管理器,可以加载外部脚本(例如:基于Python和Package Control的Sublime Text)。
但现在我有一个难题:我真的很欣赏LuaJIT FFI所提供的易用性,可以将其与我的引擎绑定起来,但是我不想为地图作者提供FFI的自由使用权。当JIT化时,通过FFI进行的lua-to-c调用的惊人速度也是我真正想要的东西。
因此,理想情况是,我将编写自己的包装器Lua文件,用FFI将其绑定到我的引擎上,并导出一个漂亮的模块供地图作者和模块制作者使用。我替代方案是编写一个vanilla lua模块,这是可能的,但更加繁琐和缓慢。
我不能在编译luajit时禁用FFI,因为显然我自己想使用它,但我不知道如何在每个脚本或每个模块的基础上限制FFI。显然,FFI需要在我加载模块的lua_State中处于活动状态(在此之后,我无法开始加载用户修改的脚本)。那我该怎么办?这可能吗?
编辑:在我看来,理想的工作流应该是:
- 打开lua状态
- 加载所有模块(luaL_openlibs()),FFI也预先加载
- 加载我的.lua模块,它们使用FFI(这是引擎绑定,它们是可信的文件,因此它们可以使用FFI)
- 禁用选择的本地模块和函数:os,ffi,…(这是缺失的步骤)
- 执行用户提供的脚本(这些是不受信任的,我不想让它们访问FFI)
- 可选:寻找重新加载lua模块的方法,以进行快速的编辑循环,这将涉及重新启用FFI和其他模块。(我也无法确定如何做到这一点)。
注意:我知道这仍然不是完美的(甚至不是好的)沙箱,正如Mike Pall在他的某些邮件中指出的那样,但我仍然不想给地图作者访问FFI的权限。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
也许我没有理解这个问题,但如果你在一个 普通的 Lua 沙盒 中使用 FFI 无法访问,那么问题在哪里?
例如:
ffi = require "ffi" ffi.cdef([[int printf(const char *fmt, ...);]]) function say_hello() ffi.C.printf("%s", "hello, "); end my_user_script = [[ say_hello() ffi.C.printf("%s\n", "world") ]] f = loadstring(my_user_script) print("=== without sandbox ===") print(pcall(f)) print("=== with sandbox ===") setfenv(f,{say_hello = say_hello}) print(pcall(f))这应该会输出:
=== without sandbox === hello, world true === with sandbox === hello, false [string "say_hello()..."]:2: attempt to index global 'ffi' (a nil value)请注意,您还需要小心不要将 FFI cdata 泄露到沙盒中。在 LuaJIT 文档中有 一个关于此的段落。