【 在 shure (韩姝儿) 的大作中提到: 】
: exec()这个函式的权力非常大, 不当地使用会危及 MUD 的
: 系统安全. 正确地限制使用此函式的方法是另外写一个同名的
: 模拟超越函式 (simulated emulated function, simul_efun)
: , 并使用 valid_override(4) 来限制此一模拟超越函式的使
: 用. (意即 efun::exec() )
shure这段话好像宝岛那边的话啊,呵呵。
我解释一下吧,我估计新手不容易看明白,:P
嗯,打算灌点水了:
mud里有efun和simul_efun的概念,efun就是所谓的超越函数,
其实就是mudos提供直接使用的函数。
simul_efun就是在mudlib里自己写的一套可以在整个lib
里使用的函数,对一般的ob来说,和efun没有什么区别。
而重载,就是在 lib里写的与efun同名的函数,(这个并不是非要
写在simul_efun_ob里不可的。)
而且还可以继续用父类的函数 ,这里就写成:
efun::exec()...很好用的一个功能,使得我们写lib的时候
更加灵活。不过mudos并不允许在lib里随便重载efun,
事实上是不让随便得使用efun::的方法调用。
对于重载合法性的检查在master.c得valid_override()里
进行,一般只会允许特定的文件重载特定的efun。
重载efun得目的,一个是做增强,比如重载destruct()。
你可以在destruct()之前作协需要的处理。
另一个就是为了安全。比如exec(),shutdown(),重载
就可以作些权限判断了,比如只允许root_uid调用这样
的efun等等。
这套机制有点复杂,不过也挺有效,就是重载太多的
efun也是挺麻烦的事情,:P。很多lib就没有重载
shutdown,exec什么的。bind有专门的valid_bind()
就省事了,呵呵。
尊重作者 转载请注明出处52mud.com