CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
安全加密GM审计

【安全加密】GM 指令审计:高危指令的调用留痕

2026-09-23 01:55 作者:996 技术组 0 阅读 996引擎Lua教程传奇脚本安全加密GM审计

实战应用:用在哪里

内部人员用 GM 指令给自己发了一枚裁决之杖,事后查不出是谁在什么时候敲的命令。GM 指令审计把高危指令的每次调用都留痕:操作人、时间、参数、结果四要素入审计流水,高危项还要双人在场确认,缺一道就拒绝执行。审计的目标不是不信任管理员,而是让每一次高危操作都有据可查,信任靠留痕维系。

高危清单与双人确认

发奖、传送、封禁三类指令列为高危,调用时要求 300 秒内的双人确认标记,缺失则拒绝执行并把未遂调用也记入审计。

lua
local RISK = { ["@move"] = true, ["@give"] = true, ["@ban"] = true }
function gmSafe(actor, cmd, args)
    if RISK[cmd] then
        local ack = tonumber(getplayvar(actor, "HUMAN", "GM_ACK_TS") or "0")
        if os.time() - ack > 300 then
            audit(actor, cmd, args, false)
            sendmsg(actor, 0, "高危指令需要双人在场确认,请让另一名管理员协助")
            return
        end
    end
    gmexecute(actor, cmd, args)
    audit(actor, cmd, args, true)
end

审计流水与月度抽查

审计行按月分片存键,四要素竖线分隔,普通指令同样留痕只是免确认;定时器每小时统计当月条目量,超限提醒归档。

lua
local function audit(actor, cmd, args, ok)
    local p = class(actor)
    local day = os.date("%Y%m")
    local line = os.time() .. "|" .. p:GetName() .. "|" .. cmd .. "|" .. args .. "|" .. (ok and 1 or 0)
    local old = getsysvar("AUDIT_" .. day) or ""
    if old ~= "" then
        line = old .. ";" .. line
    end
    setsysvarex("AUDIT_" .. day, line, 1)
end
setontimerex(172, 3600)
function ontimer172()
    local raw = getsysvar("AUDIT_" .. os.date("%Y%m")) or ""
    local cnt = 0
    for row in string.gmatch(raw .. ";", "([^;]*);") do
        if row ~= "" then cnt = cnt + 1 end
    end
    if cnt > 5000 then
        sendmail("#安全审计员", 911, "审计条目超限", "本月已记录 " .. cnt .. " 条,请归档", "")
    end
end

验证与监控

高危指令验证无确认拒绝并留痕、双人确认后执行成功;普通指令直通留痕;审计行四要素逐字段核对。审计流水支持按操作人拉取个人全量记录,离职交接时的账号审计直接导出。确认标记在两次使用间共享一个时间戳,两名管理员先后执行高危指令时需要各自重新确认。监控每月审计条目量与拒绝次数,拒绝集中在同一个账号就是违规试探,直接升级处理。

踩坑记录

审计行用分号分隔,指令参数里本身带分号时一行被拆成两行,解析端错位,参数侧做了字符白名单转义。双人确认标记发起后不校验第二人身份,自己两个号互刷确认就能绕过,确认标记必须来自另一个已登记的管理员账号。审计键按月分片但没做过期清理,一年后老键占了一大片变量空间,过期归档任务按 90 天滚动清理。gmexecute 的变参透传在参数为空时报参数不足,空参数场景在封装里补了默认空串。

作者履历与出处

本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

← 返回文章地图返回研学路径

最新技术文章 · 实战干货

LATEST ARTICLES

全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →

玩法策划沙巴克印玺

【玩法策划】城主印玺:印玺权限与特权时限的玩法设计

实战应用:用在哪里 占领沙巴克的收益只有税收一条,城主玩起来没有治理感。城主印玺给占领行会三枚政策印玺:传送令开城内免费传送…

2026-09-23 02:23 996 技术组 · 0 阅读
玩法策划斗兽棋棋盘

【玩法策划】斗兽棋盘:棋盘格与走子规则抽象的玩法设计

实战应用:用在哪里 酒馆缺一个轻量小游戏留住等朋友的玩家。斗兽棋搬进比奇酒馆:七乘九棋盘八种棋子,鼠象互克、狮虎跳河,每日挑…

2026-09-23 02:23 996 技术组 · 0 阅读
案例复盘合服排行榜

【案例复盘】合服排行数据错乱的事故复盘

实战应用:用在哪里 四服合一时排行榜串了档:137 个跨服同名玩家在榜单上互相覆盖,89 条榜单数据张冠李戴,榜三的裁决之杖…

2026-09-23 02:23 996 技术组 · 0 阅读
界面UI目标框血条

【界面UI】目标框:选中框的信息密度与排序

实战应用:用在哪里 打祖玛教主时目标信息一屏全塞,打小怪时框里空得只剩名字。目标框按目标类型分两档密度:普通目标只展示名字加…

2026-09-23 02:23 996 技术组 · 0 阅读
前端接口排行榜详情

【前端接口】排行榜详情页:点入详情的界面实现

实战应用:用在哪里 榜单只显示名字和数值,玩家想知道榜一大哥的装备评分就得私聊问。排行榜详情页补上这层:点榜单条目上行排名号…

2026-09-23 02:23 996 技术组 · 0 阅读
数据存储主从读写分离

【数据存储】主从延迟:读写分离的秒级延迟应对

实战应用:用在哪里 读写分离上线后,玩家刚领完奖励刷新面板却查不到,主库写入还没同步到从库,延迟高峰有两秒。应对方案分两层:…

2026-09-23 02:23 996 技术组 · 0 阅读