好友互赠体力上线的第三天,排行榜积分榜前排出现一批数值雷同的账号:两个号互刷体力,一天白拿四百二十点积分。复盘这次刷分事件:接口有每日三次上限,但上限记在双方各自的变量里,小号矩阵轻松绕开。
赠体力接口校验了“每人每日可领三次”,计数写在受赠方变量;小号轮换着送,每个小号的三次都归新号,主号一天能收几十次。
function giftVitality(actor, friendName)
local player = class(actor)
local got = tonumber(getplayvar(friendName, 2, "GIFT_GOT") or "0")
setplayvar(actor, "HUMAN", "GIVE_CNT", (tonumber(getplayvar(actor, 2, "GIVE_CNT") or "0")) + 1, 1)
sendmail(friendName, 0, "好友赠送", player:GetName() .. " 送1点体力", "体力丹|1")
end
受赠方的GIFT_GOT压根没人写,校验形同虚设。
补丁把计数改到双方:赠出方按次扣、受赠方按日封顶三次,另加同IP赠送折半的宽松风控。追回侧按积分流水把异常积分扣回,误伤名单人工复核后返还。
function giftVitalityV2(actor, friendName)
local give = tonumber(getplayvar(actor, 2, "GIVE_CNT") or "0")
if give >= 3 then
sendmsg(actor, 0, "今日赠送次数已用完")
return
end
setplayvar(actor, "HUMAN", "GIVE_CNT", give + 1, 1)
sendmail(friendName, 0, "好友赠送", "体力赠送", "体力丹|1")
end
双号互刷用例固定回归:主号日收不得超过三次。监控积分增量分布,单号日增超过阈值进入观察名单,次日复核。
计数记在单侧是这次事故的根因,社交类接口的每个计数都要问一句“对面能不能绕”。追回扣分容易误伤真实好友,先按行为特征圈嫌疑名单,批量扣回前抽样人工看十条。公告口径写“打击违规”而非“封号”,把正常玩家吓着得不偿失。这类漏洞的黄金发现渠道是积分榜的数值分布,雷同数值扎堆就是信号,榜单调优顺带当了哨兵。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
设计初衷 行会招人的门槛是双刃剑:无门槛的行会人满为患却乌合之众,高门槛的行会精英云集却关死了普通玩家的归属感。分层准入的目…
设计初衷 副本钥匙是副本经济的闸门:钥匙太贱,副本门口排大队、产出洪水冲垮经济;钥匙太贵,副本冷清、核心玩法没人体验。密钥平…
设计初衷 节日活动是在线峰值的引爆点:春节回城烟花一放,比奇主城同屏人数冲上日常的三倍,卡顿、掉线、排队接踵而至。峰值预案的…
底层原理 单线程的 Lua 没有并发,却有"重入":玩家的一次操作还没走完,同一次点击的第二个触发又进来了(双击、连点、宏)…
底层原理 一条业务链路往往穿越四五个函数:入口触发 → 校验 → 结算 → 通知。玩家对象、来源渠道、事务单号这些"全程都要…
业务场景 拜师系统的人数规则:一师最多三徒,出师空位才可再收。申请侧痛点:师父一次收到十几份申请无从挑起,口头答应后被人抢先…