反作弊基础
呼应服务端与客户端那条铁律:永远不能信客户端。这一篇讲怎么在玩法层面防作弊。完整的反作弊是专门领域(有 NoCheatPlus、Matrix 等成熟插件),这里讲你自己写玩法时必备的防范意识。
三类作弊与防范
1. 数据造假
客户端发来的数据可能被篡改。典型:自定义协议包、Mod 伪造请求。
防范:服务端不信任客户端传的"结果",自己算"过程"。
反面案例
客户端发"我打死了 Boss,给我 1000 金币"→ 服务端就给?错。正确:服务端监听 EntityDeathEvent,自己判断"是不是这个玩家杀的、Boss 是不是合法刷新的",自己发奖。客户端不能"声称"结果。
2. 数值溢出 / 越界
玩家可能输入超长字符串、负数、超大数。
防范:所有外部输入校验边界。
java
public void setBalance(UUID id, double amount) {
if (amount < 0) amount = 0; // 不能负
if (amount > 1_000_000_000) amount = 1_000_000_000; // 上限
balances.put(id, amount);
}- 金额:校验非负、有上限
- 字符串:限长度、过滤特殊字符
- 数量:校验合法范围
3. 重复请求 / 并发刷
玩家快速点击、并发触发,刷奖励。
防范:加冷却 + 幂等。
java
private final Map<UUID, Long> cooldowns = new HashMap<>();
public boolean tryClaim(UUID id, long cooldownMs) {
long now = System.currentTimeMillis();
Long last = cooldowns.get(id);
if (last != null && now - last < cooldownMs) {
return false; // 还在冷却
}
cooldowns.put(id, now);
return true;
}幂等性
"领签到奖励"这种操作要幂等——领过一次再点不该重复发。用 Set<UUID> 记录今日已领,重复请求直接拒绝。
常见作弊场景与对策
飞行 / 加速
客户端能伪造移动数据。
- 服务端检测:监听
PlayerMoveEvent,若垂直速度异常(无掉落却持续上升)、水平速度超过合法上限,拉回原位 - 用现成反作弊:NoCheatPlus 等已实现成熟的移动检测,别自己从零写
刷物品
复制 bug、刷物品是高危漏洞。
- 背包操作走服务端:用
InventoryClickEvent校验,禁止非法拿取(见箱子 GUI) - 关键物品加 NBT 标记:自制物品加唯一 tag,兑换时验证 tag 防伪造
多开 / 小号刷
一人多号刷新手奖励。
- IP 限制:同 IP 限号(不完美,有校园网/代理)
- 设备指纹:难,通常靠官方认证
- 行为分析:异常的新号模式(同时段、同 IP 批量注册)人工审核
协议包作弊
伪造数据包(瞬移、假动作)。
- 服务端权威:关键状态服务端自己维护,不依赖客户端包
- ProtocolLib 监听:可疑包模式可拦截(进阶,见自定义发包)
服务端校验清单
写每个玩法功能时,过一遍:
- [ ] 这个操作的数据来源可信吗?(客户端传的 vs 服务端自己算的)
- [ ] 输入有边界校验吗?(非负、上限、长度)
- [ ] 有冷却防刷吗?
- [ ] 幂等吗?(重复请求不重复发奖)
- [ ] 关键数据持久化了吗?(重启不丢、可回滚)
- [ ] 权限检查了吗?(OP 才能用的管理命令)
数据回滚与审计
出了作弊事件要能查、能撤。
操作日志
关键操作(发钱、改等级、删物品)记日志:
java
public void audit(String action, UUID player, String detail) {
log.info("[AUDIT] {} player={} {}", action, player, detail);
// 也可写专门的审计表/文件
}定期备份
数据库定时备份(每天/每小时)。出事能回滚到备份点。
CoreProtect
方块操作用 CoreProtect 插件记录——玩家被恶意破坏、误操作,能精确回滚到操作前。这是基建级反作弊/容灾工具。
与成熟反作弊插件配合
别重复造轮子
移动检测、 reach(攻击距离)、speed 这类通用反作弊,NoCheatPlus/Matrix 已经做得很完善。你的插件专注玩法数据的防刷(经济、奖励、进度),通用行为检测交给反作弊插件。
常见坑
- 误判:检测太严会误伤正常玩家(跳跳乐被判飞行)。阈值要调,给容差
- 延迟补偿:网络延迟下玩家位置有偏差,检测要留余量
- 性能:每个事件都跑检测会拖 TPS,已检测通过的快速跳过
下一篇数据持久化。
