strict: 我的 MC 服登录握手就验模组
strict 是跑在 Fabric 服务端的登录准入模组, 干一件事: 玩家登录这刻验模组和令牌, 不对直接踢。原版在线验证只管你是不是正版号, 不管你装了啥, 所以 X-ray 透视矿、飞行、自动钓鱼这类客户端模组照样能进香草服。strict 把关口挪到登录握手。跑 1.21.3, Java 21, Fabric Loom 构建, 仓库 github.com/dwgx/strict。
核心是登录握手插一脚。hook 到 ServerLoginConnectionEvents.QUERY_START, 服务端走自定义通道 strict:check 找客户端要数据。客户端 ClientNetworking 回一个 CheckPayload, 里面塞两样: 一个 AES-GCM 加密令牌, 加当前加载的完整模组列表。服务端先解密验 SHA-256, 再看 nonce 十分钟内没重复、时间戳五分钟内新鲜, 最后才比模组策略。
为啥不光验模组列表? 列表是客户端自己报的, 能报就能伪造。令牌那层证明这个回包确实是我这模组刚发的, nonce 防重放, 时间戳防抓包慢慢用。加解密和哈希都在 CryptoUtils, 密钥从 secretKey 派生。这里埋了个坑: 默认值 dwgx1337 是我图省事测试留的, 拿去开服不改等于没设防, 文档专门喊了一嗓子。
访问控制两个模式。公开模式验过就进, OP 放行。私密模式好玩点, 陌生人卡在 pendingPlayers, 先断开让他等审批, 管理员聊天框弹可点的 [Accept] / [Reject] / [Blacklist], 点一下完事, 不用记命令。拉黑支持 UUID 也支持机器名, 上报带 OS 用户名, 对付换小号的熊孩子有点用。
配置在 config/strict/config.yml, allowedMods / excludedMods 管白黑名单, allowFabricMods 开了自动放行 fabric- 前缀的官方模组。命令都在 /strict 下, OP4 级, 切模式、审批、/strict reload 热重载不用重启。目前 1.0-SNAPSHOT 死绑 1.21.3, 自己开服顺手做的实验。