- 打卡等级:魔龙套勇士
- 打卡总天数:117
- 打卡月天数:10
- 打卡总奖励:13851
- 最近打卡:2025-08-10 00:32:31
管理员
本站站长
- 积分
- 8084
|
修复传奇游戏脚本漏洞需要结合漏洞类型(如权限控制、经济系统、触发逻辑等),针对性调整脚本逻辑、补充校验机制,并通过严格测试验证修复效果。以下是分场景的具体修复方案,包含脚本代码示例和验证方法:
一、权限控制漏洞修复
核心目标:严格限制敏感操作(如刷装备、改权限)的执行权限,确保只有管理员或特定权限用户可操作。
1. 管理员命令权限校验修复
漏洞场景:普通玩家可执行@make(刷装备)、@ChangeMode(开无敌)等管理命令。
修复思路:
使用引擎提供的权限判断函数(如CheckLEVELEX、CheckAdmin)明确权限等级(通常管理员权限≥100)。
隐藏或加密管理命令,避免玩家猜解。
错误脚本示例:
text
; QFunction-0.txt 中错误的刷装备脚本
#ACT
; 无权限校验,任意玩家可执行
Make 屠龙刀 1
修复后脚本:
text
; 仅允许权限≥100的管理员执行
#IF
CheckLEVELEX > 99 ; 权限等级>99(即≥100)
#ACT
Make 屠龙刀 1
#ELSEACT
SendMsg 7 权限不足,无法执行该命令 ; 普通玩家执行时提示错误
2. 越权访问(如查看他人数据)修复
漏洞场景:玩家可通过@LookBag 玩家ID查看任意玩家背包。
修复思路:校验操作对象是否为执行者本人,或限制仅管理员可跨用户操作。
错误脚本示例:
text
; @LookBag命令脚本(未校验权限和对象)
#ACT
OpenBag <$TARGETID> ; 直接打开目标玩家背包
修复后脚本:
text
#IF
; 两种情况允许执行:1. 查看自己的背包;2. 管理员查看他人背包
(Equal <$TARGETID> <$USERID>) || (CheckLEVELEX > 99)
#ACT
OpenBag <$TARGETID>
#ELSEACT
SendMsg 7 无权查看该玩家背包 ; 非本人且非管理员时拒绝
二、经济系统漏洞修复
核心目标:确保资源(元宝、材料、装备)的 “增减平衡”,避免 “只给不扣” 或 “扣少给多”。
1. 无限刷资源(回收 / 合成脚本)修复
漏洞场景:装备回收时只给元宝不扣装备,或合成时只出成品不消耗材料。
修复思路:
所有Give(添加)操作必须对应Take(扣除)操作,且数量一致。
用CheckItem先验证玩家是否有足够资源,再执行扣除和添加。
错误脚本示例(装备回收):
text
; Market_Def\回收.txt 错误示例
#IF
CheckItem 青铜剑 1 ; 检查是否有1把青铜剑
#ACT
Give 元宝 50 ; 给50元宝,但未扣除青铜剑(可无限回收)
修复后脚本:
text
#IF
CheckItem 青铜剑 1 ; 先确认有足够物品
#ACT
Take 青铜剑 1 ; 先扣除物品
Give 元宝 50 ; 再添加资源(顺序不可颠倒)
#ELSEACT
SendMsg 7 背包中没有青铜剑,无法回收 ; 物品不足时提示
2. 数值溢出(金币 / 属性异常)修复
漏洞场景:金币或属性值超过上限(如金币变为负数、攻击突破 10 万)。
修复思路:
对AddGold(加金币)、AddAttack(加攻击)等命令设置数值上限。
用Less(小于)、Greater(大于)函数限制输入参数范围。
错误脚本示例(金币奖励):
text
; 任务奖励脚本,未限制金币数量
#ACT
AddGold <$PARAM> ; 玩家可输入超大值(如999999999)导致溢出
修复后脚本:
text
#IF
Less <$PARAM> 100000 ; 单次奖励上限10万金币
#ACT
AddGold <$PARAM>
#ELSEACT
SendMsg 7 单次奖励金币不能超过10万 ; 超过上限时拒绝
三、触发逻辑漏洞修复
核心目标:限制脚本触发次数(如任务奖励、地图进入奖励),避免无限重复触发。
1. 无限触发物品 / 任务奖励修复
漏洞场景:双击经验卷不消耗物品,或重复接取同一任务获取奖励。
修复思路:
触发后立即删除物品(Delete)或标记任务状态(SetVar)。
用CheckVar(检查变量)判断是否已触发,避免重复执行。
错误脚本示例(经验卷):
text
; 经验卷触发脚本(StdItems.DB关联QF)
#ACT
AddExp 10000 ; 增加经验,但不删除物品(可无限双击)
修复后脚本:
text
#IF
CheckItem 经验卷 1 ; 确认有物品
#ACT
Delete 经验卷 1 ; 先删除物品
AddExp 10000 ; 再增加经验
#ELSEACT
SendMsg 7 物品不存在 ; 防御异常触发
2. 地图无限触发奖励修复
漏洞场景:每次进入某地图都给金币,无次数限制。
修复思路:通过玩家变量记录 “是否已触发”,仅允许首次进入时获取奖励。
错误脚本示例(MapEvent.txt):
text
; 地图100进入触发,无次数限制
[地图=100 进入触发]
#ACT
Give 金币 1000 ; 每次进入都给1000金币
修复后脚本:
text
[地图=100 进入触发]
#IF
CheckVar EnterMap100 0 ; 检查变量EnterMap100是否为0(未触发过)
#ACT
SetVar EnterMap100 1 ; 标记为已触发(变量值改为1)
Give 金币 1000
#ELSEACT
SendMsg 7 已领取过该地图奖励 ; 重复进入时提示
四、注入类漏洞修复
核心目标:过滤用户输入的特殊字符(如;、#、@),防止输入内容被解析为脚本命令。
聊天 / 输入框注入修复
漏洞场景:玩家在聊天框输入;@make 屠龙刀 1,通过分号;截断原命令并执行刷装备。
修复思路:使用CheckValidStr函数过滤特殊字符,仅允许安全字符(字母、数字、中文)。
错误脚本示例(聊天脚本):
text
; 未过滤特殊字符,直接拼接玩家输入
#ACT
SendMsg 0 玩家<$USERNAME>说:<$MSG> ; <$MSG>包含玩家输入的特殊字符
修复后脚本:
text
#IF
CheckValidStr <$MSG> 1 ; 1表示允许中文、字母、数字(过滤;、#、@等)
#ACT
SendMsg 0 玩家<$USERNAME>说:<$MSG>
#ELSEACT
SendMsg 7 输入包含非法字符 ; 含特殊字符时拒绝发送
五、修复验证与测试方法
权限测试:
用普通玩家账号执行修复后的命令(如@make),确认提示 “权限不足”。
用管理员账号执行,确认能正常执行,验证权限边界(如权限 99 的账号无法执行,100 的可以)。
资源平衡测试:
测试回收 / 合成流程:提交 1 个物品,检查背包是否正确扣除,资源是否对应增加,重复提交是否失败。
触发次数测试:
对经验卷、地图奖励等,触发一次后再次尝试,确认无法重复获取,变量状态是否正确更新(如EnterMap100变为 1)。
注入测试:
在聊天框输入;@make 屠龙刀 1,确认被拦截并提示 “非法字符”,后台无刷装备记录。
六、通用预防措施
脚本审计:定期用 “全局搜索” 工具检查敏感命令(Make、Give、AddExp),确保都有对应的权限校验或扣除逻辑。
备份与版本控制:修复前备份原脚本(如QFunction-0_backup.txt),避免修复错误导致脚本失效。
引擎适配:不同引擎函数可能不同(如 GOM 引擎用CheckAdminLevel,HeroM2 用CheckLEVELEX),需参考对应引擎文档。
模拟攻击:用测试账号模拟玩家可能的漏洞利用方式(如重复触发、输入特殊字符),提前发现未修复的逻辑缺陷。
通过以上方法,可有效修复 90% 以上的常见脚本漏洞。修复后需在测试服运行 24 小时以上,观察是否有异常日志(如M2Server.log中的Invalid Command或资源异常变动),确认无问题后再部署到正式服。
|
|