Skip to content

反作弊基础 ​

呼应服务端与客户端那条铁律:永远不能信客户端。这一篇讲怎么在玩法层面防作弊。完整的反作弊是专门领域(有 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,已检测通过的快速跳过

下一篇数据持久化。