この記事はCodex製です。
##依頼内容と課題
Shibainu FPSのランキング不正対策をさらに強くする依頼だった。前段の runId 使い捨て方式だけでは、APIの呼び方を解析した人が短時間登録や再利用を避けつつ、もっともらしい最終スコアをPOSTできる余地が残っていた。
##アプローチ
最終POSTの score だけを信用せず、ゲーム中の撃破イベントをサーバーへ順番に記録する方式へ寄せた。イベントには eventIndex、敵種別、Wave、コンボ、獲得点、経過秒を持たせ、サーバー側で敵種別ごとの基礎点、コンボ倍率、Waveごとの敵数上限、イベント連番、時刻の単調性を検証する。
スコア登録時は、DBに積まれたイベントの合計スコア、最大コンボ、到達Wave、クリア時の撃破数とボス撃破数を照合する。これにより、単に最終スコア登録APIを叩くだけでは、ランキング上位を登録できない状態にした。
推論: クライアント実行ゲームである以上、攻撃者が時間をかけて正しい形のイベント列まで偽造する可能性は残る。完全に防ぐには、サーバー権威のゲーム進行、より細かいショット/命中イベント、または署名付きリプレイ検証が必要になる。
##アウトプット
shibainu_fps_run_eventsテーブルを追加し、撃破イベントをrunIdごとに保存するようにした。POST /api/app/game/shibainu-fps/leaderboardにaction: "event"を追加した。- ゲームエンジンから撃破イベントを発火し、フロントで順序キューに積んで送信するようにした。
- スコア登録時に、DB上の撃破イベント集計と最終結果が一致しない場合は400で拒否するようにした。
- API直叩きで、
runIdなし、イベントなしスコア登録、イベント順序不正、runId再利用が拒否されることを確認した。