MUD游戏开发进阶:UID 和 EUID 权限系统 | privs权限系统

本文节选自《LPC语言基础教程:从零学习游戏开发》,版权归@mudren,欢迎转载,但必须注明来源(mud.ren)。

UID权限系统

当驱动编译时 #define __PACKAGE_UIDS__ 就支持 UIDEUID 相关的功能。

linux系统中每个进程都有2个ID,分别为用户ID(uid)和有效用户ID(euid),UID一般表示进程的创建者(属于哪个用户创建),而EUID表示进程对于文件和资源的访问权限(具备等同于哪个用户的权限)。C语言中,可以通过函数getuid()和geteuid()来获得进程的两个ID值。

在LPC语言中,非常类似,我们可以通过 UID 实现权限控制功能。

UID 具体有以下相关外部函数:

seteuid(3), geteuid(3), getuid(3), export_uid(3), set_author(3), domain_stats(3), author_stats(3)

还有以下 apply 方法:

valid_seteuid(4), get_root_uid(4), author_file(4), get_bb_uid(4), domain_file(4), creator_file(4)

一个对象的用户ID(uid)由对象创建时 creator_file() 方法的返回值决定,这个方法在主控对象中。

如果对象没有设置 euid,则 euid 和 uid 相同。如果 euid 设置为 0,当前对象的用户ID(uid)可以且仅可以使用 export_uid() 外部函数改变。另外,如果 euid 为 0,这个对象不能载入或复制任何对象。

请注意:有很多对UID系统不熟悉的新手开发者误认为配置好相关apply方法就实现了权限系统,这是不对的。驱动只是提供了UID系统权限接口,能让你实现完整的权限验证模块,但并不是直接提供权限控制的具体实现,你的LIB的权限系统需要自己使用相关efun和apply开发实现,如果自己代码没写好,也会出现重大权限漏洞。

privs权限系统

因为UID权限系统虽然非常强大,但实现起来比较复杂,搞不好就出漏洞了,除了UID方式,还有使用privs权限控制的方式,这是国外LIB使用比较多的鉴权方式,实现起来相对简单,主要是通过文件路径和目录判断是否有权限。

privs相关efun只有二个:set_privsquery_privs,另外也有一个apply方法:privs_file

请注意:privs权限系统并不是简单的判断当前目录路径,如果你有某个目录的读写权限,这个目录下的文件复制到其它目录,你依然有这个被复制的文件的读写权限。

京ICP备13031296号-4