后台安全的核心问题是权限验证。传奇默认的AdminList.txt机制存在明显缺陷:只要角色名被写入该文件,登录后自动获得最高权限,没有任何二次验证环节。一旦AdminList.txt被篡改或泄露,攻击者可以直接获得完整后台控制权。以下方案通过脚本层实现多重验证,弥补引擎原生机制的不足。
## 一、管理名单与密码双重验证
单纯依赖AdminList.txt判断管理员身份不够安全。需要在NPC脚本中增加独立的密码验证环节,只有管理名单中的角色同时输入正确密码,才能进入后台功能区域。
在Market_Def目录下新建后台NPC脚本,核心验证逻辑如下:
```
[@main]
#IF
CHECKNAMELIST ..\QuestDiary\游戏功能检测\管理名单.txt
#ACT
MOV N32 888888
GOTO @密码验证
#ELSESAY
你没有权限使用此功能。
[@密码验证]
#IF
#ACT
MOV N33 0
#SAY
请输入后台密码:\
<输入密码/@@InPutInteger33>\
[@@InPutInteger33]
#IF
EQUAL N33 <$STR(N32)>
#ACT
GOTO @后台功能
#ELSESAY
密码错误,无法进入后台。
```
管理名单.txt需要手动创建,路径为QuestDiary\游戏功能检测\管理名单.txt。该文件中的角色名是进入后台的第一道门槛。密码变量N32的初始值在脚本中设定,每次服务端重启后需要重新赋值。这段脚本的关键点在于:即使角色名在AdminList.txt中,如果不在管理名单.txt中,依然无法进入后台功能。两个名单文件分开维护,任何单一文件泄露都不会直接暴露后台入口。
## 二、GM上线自动降权机制
管理员账号在线期间拥有完整权限是最大的安全隐患。攻击者获取GM账号后,可以直接使用所有管理命令。解决方案是让GM上线时权限自动降为0,仅在需要时手动提升。
在QManage.txt的[@Login]段落中添加以下脚本:
```
[@Login]
#IF
ISADMIN
#ACT
CHANGEMODE 3 1
CHANGEPERMISSION 0
SENDMSG 6 管理员权限已临时关闭。
BREAK
```
CHANGEMODE 3 1将管理员设置为隐身模式,其他玩家无法看到GM角色。CHANGEPERMISSION 0将当前权限等级降为0,GM命令全部失效。需要执行管理操作时,GM通过后台NPC输入密码临时提升权限,操作完成后立即降回0。这样即使GM账号在线期间被他人控制,也无法直接调用管理命令。
脚本中的ISADMIN条件由引擎根据AdminList.txt自动判定,不需要额外配置。
## 三、后台密码的独立管理
后台密码不应写在脚本正文中,否则任何能查看脚本文件的人都能看到密码。推荐将密码存放在独立的配置文件中,脚本运行时读取该文件。
在QuestDiary\游戏功能检测\目录下新建后台密码.txt,内容为纯数字。脚本中通过以下方式读取:
```
[@读取密码]
#IF
#ACT
GETSTRING 后台密码.txt 1 N30
```
GETSTRING命令从文本文件指定行读取内容到变量。后台密码.txt的第一行存放密码数字。每次修改密码只需编辑该文件,不需要改动脚本。文件权限建议设置为仅管理员可读,配合服务器操作系统的文件权限控制。
## 四、防刷元宝的订单校验机制
刷元宝漏洞是后台安全中最常见的攻击方式。攻击者通过行会公告输入框或二级密码输入框构造特殊指令,绕过服务端校验直接刷取元宝。防御的核心是在每一笔元宝发放之前,校验订单的合法性。
充值NPC脚本中,元宝发放逻辑必须包含CHECKACCOUNTLIST验证:
```
[@领取元宝]
#IF
CHECKACCOUNTLIST ..\QuestDiary\充值记录\订单号.txt
#ACT
DELACCOUNTLIST ..\QuestDiary\充值记录\订单号.txt
GAMEGOLD + 10000
ADDTEXTLIST ..\QuestDiary\充值记录\已发放.txt <$USERNAME> <$USERID> <$DATETIME>
SENDMSG 6 充值到账,元宝已发放。
#ELSESAY
订单无效或已领取。
```
CHECKACCOUNTLIST检测当前账号是否在指定订单文件中。DELACCOUNTLIST在发放后立即从订单文件中删除该账号,防止同一订单被重复领取。ADDTEXTLIST记录发放日志,包含角色名、账号和发放时间,用于事后追溯。
订单文件由支付平台回传生成,每次充值产生一个独立的订单文件。脚本读取后立即删除,确保一单只发一次。
## 五、脚本文件加密与后门排查
脚本明文存放是后台安全的最大物理风险。QManage.txt和QFunction-0.txt包含所有登录触发和功能触发逻辑,一旦被下载或篡改,攻击者可以植入后门脚本。
使用引擎自带的加密工具对这两个文件进行加密。GOM引擎的加密命令在M2Server控制器中执行,Herom2和Legend引擎的脚本加密器位于引擎安装目录的Tools文件夹下。加密后的脚本文件以二进制形式存储,无法直接查看和修改。加密前务必备份明文版本,加密后测试所有功能是否正常运行。
后门排查需要检查以下位置。AdminList.txt中是否存在陌生角色名,尤其是非当前GM账号的名字。QManage.txt的[@Login]段落中是否存在额外的KICK或CHANGEPERMISSION命令,这些可能是攻击者预留的踢人或降权后门。QFunction-0.txt中搜索ADMIN、CHANGEPERMISSION、GAMEGOLD等关键字,检查是否有未授权的元宝发放或权限提升逻辑。
## 六、跨引擎适配说明
Herom2引擎对上述所有命令支持完整,可直接使用。GOM引擎需要额外确认M2控制器的命令权限配置,进入选项菜单下的游戏命令页面,检查核心管理命令的所需权限值是否全部为10。如果发现任何管理命令的权限要求低于10,立即修改。GEE引擎的@@InPutInteger33需要改为@@InPutString格式,密码验证逻辑中的EQUAL N33比较改为EQUAL S33。LEG引擎的CHANGEPERMISSION命令语法为CHANGEPERMISSION 权限值,不需要第二个参数。
所有引擎通用的一条原则:后台安全脚本的部署必须在服务端上线之前完成,上线后再修补的代价远高于预先配置。

