日志是排查问题的生命线,但日志里的手机号、支付单号、真实姓名如果明文存储,日志库本身就成为泄露源。日志脱敏的规范在写入时完成:敏感字段按类型掩码,查询的展示按权限二次脱敏。
---敏感字段的掩码规则
local MASK_RULES = {
phone = function(v) return string.sub(v, 1, 3) .. "****" .. string.sub(v, -4) end,
name = function(v) return string.sub(v, 1, 1) .. string.rep("*", #v - 1) end,
order = function(v) return string.sub(v, 1, 6) .. "****" end,
}
function LogWrite.masked(kind, fields)
local masked = {}
for k, v in pairs(fields) do
local rule = MASK_RULES[k]
masked[k] = rule and rule(v) or v
end
QF_AppendLog(kind, masked)
end
掩码的规则按字段类型定义:手机号保留前三后四、姓名保留首字、订单号保留前六位。掩码在写入时完成而不是查询时处理,泄露的面上就没有明文。脱敏的白名单:内部审计角色的查询走带权限的原始数据通道,权限的审计与日志同源。
---查询的权限校验与二次脱敏
function LogQuery.search(operator, kind, key)
if not LogQuery.hasPerm(operator, kind) then return nil, "无权限" end
local rows = QF_SearchLog(kind, key)
if not LogQuery.isAuditor(operator) then
for _, r in ipairs(rows) do
r.phone = MASK_RULES.phone(r.phone)
end
end
return rows
end
查询的权限分级:普通客服看掩码数据,审计员看原始数据且每次查询留痕。脱敏的规则与权限的矩阵在配置表维护,规则的变化走审批。日志的保留期按类型分级:支付类日志保留三年、行为类一年、调试类 30 天,保留期的差异是合规与成本的平衡。
脱敏的覆盖率扫描:抽样日志的敏感字段明文检测,明文零容忍。
掩码的规则曾经漏了 QQ 号字段,客服后台的 QQ 号明文可见,字段清单的全量扫描补上了漏网的字段。掩码的调用曾经依赖开发者自觉,日志写入的封装层强制脱敏后,漏掩码的问题从机制上根除。
脱敏的规则进配置表,新字段的掩码规则登记即生效。日志的查询审计与权限的矩阵联动,每一次原始数据的查询都有操作人与事由。脱敏的验证用例进回归集,规则的回归在每次发版跑一遍,数据安全的底线靠用例守护。
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 沙巴克开战前600秒,行会会长一键集结,全会在线成员无论在哪张图都收到带坐标的集结消息,点击直达集合点。…
实战应用:用在哪里 远征副本上线前夜,压测编排把“上线会不会崩”变成一场有脚本的预演:模拟满员远征、三选一齐选、奖励齐领三个…
实战应用:用在哪里 结义合击玩法上线三天,客服收到“攻击加成叠了三层”的报告:同一次合击,三个入口各挂了一次加成Buff。复…
实战应用:用在哪里 “强化石×3”值不值得跑一趟毒蛇山谷,玩家心里没数。任务接取页的奖励预览把物品换算成战力参考值:每件物品…
实战应用:用在哪里 “转生怎么升”“红名怎么洗”这类问题八成答案都在帮助中心,玩家却习惯直接问客服。自助查询把帮助条目做成关…
实战应用:用在哪里 烈火剑法的打击节奏由前摇与后摇决定:前摇太长玩家觉得迟钝,后摇太短连招没有张力。节奏调优把前后摇参数化:…