跳至正文

8 月:模块、需求与安全性!

· 6 分钟读完
Gabriel • SyedMuhammad
lead developer™

包需求、模块、安全性、文档++ 及更多!

来看看 8 月最新更新的汇总吧!

异步操作改进​

在 nanos world 中,我们有一堆在后台运行的操作和方法,包括核心/内部和脚本操作(如 HTTP.RequestAsync、File.ReadAsync、SceneCapture.EncodeToBase64Async 等),执行时,这些方法会启动一个新线程以异步执行。

最棘手的部分是控制它们,也就是说,在异步操作完成之前,我们无法完全销毁一个文件实体,这就是为什么如果我们试图销毁一个正在执行异步读取的文件(或重新加载一个包含大量此类文件的包),服务器可能会冻结几秒钟。

问题在于,在上次更新之前,我们对所有运行的线程有一个全局控制,也就是说,如果我们想销毁一个文件,我们需要等待所有异步操作完成,以确保没有与该文件相关的操作仍在运行。

但这次新更新改变了这一点!现在我们有一个新系统控制所有按实体运行的操作,这意味着一个实体不会因为需要等待它不需要的东西而受到影响(或影响)服务器的任何其他部分。

此改进还修复了我们遇到的许多死锁,并大大改善了处理异步方法时的整体卡顿。

Package.Require 缓存​

我们在 Package.Require 的内部工作方式上获得了一些改进,并且它获得了一个新参数:force_load。

现在它会缓存文件的返回值,以便在你尝试再次加载文件时返回。你可以通过向添加的新参数传递 true 来绕过此行为:Package.Require(file, force_load)。

新模块行为​

模块是可以在服务器上运行的外部原生代码(.dll 或 .so)。

目前它们的工作方式是在 Server/Modules/ 文件夹中查找你的二进制文件,然后你可以使用原生方法 require("module_name") 加载它们。

此工作流程在即将到来的更新中正在经历重大改进。未来,我们的目标是让模块像包一样工作——即创建一个模块类型的包,以独立方式加载二进制文件,这样我们就可以将其作为包在我们的商店/资源库中提供,并且可以以更标准的方式加载它们(使用包依赖项或 Package.Require())。

因此考虑到这一点,我们迈出了第一步:我们实现了自己的二进制加载器,可以控制加载 .dll 或 .so,而不再需要原生 require()。

这样,现在暂时* Package.Require() 可以加载 .dlls/.so,而 require() 现在只是 Package.Require() 的别名,使一切仍然向后兼容。

提示

这种别名也解决了与原生 require 相关的几个漏洞和问题,并使一切保持在我们的沙盒环境控制之下。

备注

*暂时,因为将来我们可能会改变使用新模块包类型加载二进制模块的方式。

在最高层面,没有任何变化,应该继续按预期工作,但在底层,现在一切工作方式都不同了,并允许我们扩展和推进到更新的实现!

脚本安全性​

我们正在服务器端实施新的安全层,以防止恶意代码在服务器创建者不知情的情况下运行。请让我知道你对这些更改的意见:

不安全的库​

现在,方法 os.execute、os.rename、os.remove、os.exit、os.getenv、os.tmpname、os.setlocale、dofile、loadfile 以及所有 io.* 只有在服务器使用新的命令行参数 --enable_unsafe_libs 启动时才能执行。

我们正在研究将其变为在 Package.toml 中定义的按包设置的可能性,而不是要求启动该命令行,这样如果包“可能不安全”,服务器所有者会收到警报(因为目前通过新游戏菜单启动时,使用这些方法的包将无法工作)。

文件访问​

这样,建议所有文件访问都通过 File 类(而不是 io.*)进行,拥有沙盒化和安全的文件访问方式。

此外,现在 File 不能再直接访问 Config.toml 文件,以防止恶意包例如窃取服务器令牌。

递归脚本表​

我们在将数据从 Lua 传递到原生方法(或脚本事件)时,对内部序列化/反序列化实现进行了重大改进。

之前我们有一个系统,如果递归表(对任何父表有引用的表)在反序列化堆栈中已经被引用,则抑制其传递(以避免无限循环),但现在我们改进了算法,可以传递递归表!

在内部它们被缓存,以防我们想要反序列化同一个表,其值只是被解引用回 Lua 堆栈!

新方法和参数​

向类添加了几个新方法和参数,仅举几例:

文档改进​

我们在文档中添加了新的基类页面和 API:Base Vehicle 和 Base Pawn,以统一 VehicleWater 与 VehicleWheeled 以及 Character 与 CharacterSimple 之间的所有共享方法。

这样我们在这些类之间维护的重复方法和事件就更少。

结语​

安全性是像 nanos world 这样的沙盒游戏的主要关注点之一,因为我们总是加载和运行第三方创建的脚本和包,我们认为服务器创建者能够完全信任并知道他们正在执行的内容非常重要。本月我们在这方面取得了巨大的改进进展,我们肯定会在接下来的更新中继续改进。

此外,模块升级对于 nanos world 变得更加健壮是一个非常重要的改进,在接下来的更新中,我们将继续巩固模块包并将一切联系在一起。

关于虚幻引擎 5.3 的一点小注:我们仍在等待其完全发布,在此之前我们不会推进游戏更新。

一如既往,如果你有建议或想法,请不要犹豫,在我们的反馈中心发表!感谢又一个月的支持!