内部人员用 GM 指令给自己发了一枚裁决之杖,事后查不出是谁在什么时候敲的命令。GM 指令审计把高危指令的每次调用都留痕:操作人、时间、参数、结果四要素入审计流水,高危项还要双人在场确认,缺一道就拒绝执行。审计的目标不是不信任管理员,而是让每一次高危操作都有据可查,信任靠留痕维系。
发奖、传送、封禁三类指令列为高危,调用时要求 300 秒内的双人确认标记,缺失则拒绝执行并把未遂调用也记入审计。
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
审计行按月分片存键,四要素竖线分隔,普通指令同样留痕只是免确认;定时器每小时统计当月条目量,超限提醒归档。
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 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 占领沙巴克的收益只有税收一条,城主玩起来没有治理感。城主印玺给占领行会三枚政策印玺:传送令开城内免费传送…
实战应用:用在哪里 酒馆缺一个轻量小游戏留住等朋友的玩家。斗兽棋搬进比奇酒馆:七乘九棋盘八种棋子,鼠象互克、狮虎跳河,每日挑…
实战应用:用在哪里 四服合一时排行榜串了档:137 个跨服同名玩家在榜单上互相覆盖,89 条榜单数据张冠李戴,榜三的裁决之杖…
实战应用:用在哪里 打祖玛教主时目标信息一屏全塞,打小怪时框里空得只剩名字。目标框按目标类型分两档密度:普通目标只展示名字加…
实战应用:用在哪里 榜单只显示名字和数值,玩家想知道榜一大哥的装备评分就得私聊问。排行榜详情页补上这层:点榜单条目上行排名号…
实战应用:用在哪里 读写分离上线后,玩家刚领完奖励刷新面板却查不到,主库写入还没同步到从库,延迟高峰有两秒。应对方案分两层:…