Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
フルスタックGoでスコア改ざんを防いだ話
Search
ponyo877
February 18, 2026
Technology
780
0
Share
フルスタックGoでスコア改ざんを防いだ話
ponyo877
February 18, 2026
More Decks by ponyo877
See All by ponyo877
全てGoで作るP2P対戦ゲーム入門
ponyo877
3
2.1k
filesystem風チャットchatsh開発で学んだGoの便利package紹介
ponyo877
1
380
Go言語の2Dゲームエンジン Ebitengineの紹介
ponyo877
2
180
OGPer あなたのサイトに簡単にOGPを付けよう
ponyo877
0
67
ISUCON14感想戦で85万点まで頑張ってみた
ponyo877
1
1.2k
Goのwasmで笑い男に挑戦してみた
ponyo877
1
230
GoのWasmでのWebRTC P2Pの検証+α
ponyo877
0
150
Ebitengineの1vs1ゲーム WebRTCの活用
ponyo877
0
770
GoのWasmでWebRTC P2Pで通信する
ponyo877
0
560
Other Decks in Technology
See All in Technology
AI時代の品質はテストプロセスの作り直し #scrumniigata
kyonmm
PRO
4
1.4k
ServiceによるKubernetes通信制御ーClusterIPを例に
miku01
1
160
Claude Code / Codex / Kiro に AWS 権限を 渡すとき、何を設計すべきか
k_adachi_01
3
440
2026年春のAgentCoreアプデ 細かいやつ全部まとめ
minorun365
3
210
データモデリング通り #5オンライン勉強会: AIに『ビジネスの文脈』を教え込むデータモデリング
datayokocho
0
220
エージェント時代の UIとAPI、CLI戦略
coincheck_recruit
0
160
AIが自律的に働く時代へ Amazon Quick で実現するAIエージェント紹介
koheiyoshikawa
0
190
小さいVue.jsを30分で作る
hal_spidernight
0
150
試作とデモンストレーション / Prototyping and Demonstrations
ks91
PRO
0
200
2026-05-14 要件定義からソース管理まで!IBM Bob基礎ハンズオン
yutanonaka
0
120
Oracle Exadata Database Service on Cloud@Customer X11M (ExaDB-C@C) サービス概要
oracle4engineer
PRO
2
8k
Every Conversation Counts
kawaguti
PRO
0
190
Featured
See All Featured
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Speed Design
sergeychernyshev
33
1.6k
The Cost Of JavaScript in 2023
addyosmani
55
9.9k
sira's awesome portfolio website redesign presentation
elsirapls
0
230
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
180
Fireside Chat
paigeccino
42
3.9k
A better future with KSS
kneath
240
18k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
54k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
We Are The Robots
honzajavorek
0
220
Transcript
フルスタック Goでスコア改ざんを防いだ話 2026-02-18 | golang.tokyo #43 ぽにょ / ponyo877
フルスタックGoでスコア改ざんを防いだ話 | ponyo877 2026-02-18 | golang.tokyo #43 2 / 17
自己紹介 ぽにょ / ponyo877 • GoでSaaSを作るエンジニア • X:@ponyo877 • GitHub:@ponyo877 • 好きなもの:映画館のポップコーン • 趣味:個人開発
フルスタックGoでスコア改ざんを防いだ話 | ponyo877 2026-02-18 | golang.tokyo #43 3 / 17
今回のテーマ・話すこと 「Ebitengine」で作った「オンラインランキング付きのゲー ムのスコアの改ざん防止 」をする時に「クライアントとサー バも同じGoのコードを共有 」した多分レアな事例
フルスタックGoでスコア改ざんを防いだ話 | ponyo877 2026-02-18 | golang.tokyo #43 4 / 17
作ったもの ”Ebitengineでオンラインランキング付きのゲームを作った際に...” Ebitengineとは?
フルスタックGoでスコア改ざんを防いだ話 | ponyo877 2026-02-18 | golang.tokyo #43 5 / 17
Ebitengine Go製の2Dゲームライブラリ
フルスタックGoでスコア改ざんを防いだ話 | ponyo877 2026-02-18 | golang.tokyo #43 6 / 17
Ebitengine ゲーム状態の更新のUpdateと画面描画のDrawを実装すればゲームが作れる
フルスタックGoでスコア改ざんを防いだ話 | ponyo877 2026-02-18 | golang.tokyo #43 7 / 17
作ったもの Ebitengineのサンプルゲーム Flappy Gopherにオンラインランキングを付けた
フルスタックGoでスコア改ざんを防いだ話 | ponyo877 2026-02-18 | golang.tokyo #43 8 / 17
課題:ブラウザゲームのスコア改ざん { ”score”: 10 999999 } > curl -X POST -d {“score”: 999999} https://api... 開発者ツールなどでAPIは丸見え、書き換えて送信すれば簡単に改ざんできる
フルスタックGoでスコア改ざんを防いだ話 | ponyo877 2026-02-18 | golang.tokyo #43 9 / 17
解決策:スコアではなく操作履歴を送る { “score”: 999999 } { “jumpHistory”: [ 736, 1440, 2816 ] } POST /score POST /history
フルスタックGoでスコア改ざんを防いだ話 | ponyo877 2026-02-18 | golang.tokyo #43 10 / 17
チート対策フロー図 | 土管の位置決め 土管シード 生成 ゲームスタート依 頼 土管シード 土管シードで発生させた乱数を使っ て土管の隙間の位置を決める 土管の隙間生成乱数のseedをサーバで発生させ、サーバで管理(元はseedなし)
フルスタックGoでスコア改ざんを防いだ話 | ponyo877 2026-02-18 | golang.tokyo #43 11 / 17
チート対策フロー図 | ジャンプ履歴の蓄積と送信 ゲームスタート! ジャンプ x n回 ジャンプのタイミングをブラウザに蓄積 jumpHistory.append(X) >< Hit x=10 x=22 x=49 x=41 ジャンプ履歴 [10, 22, 41, 49] 60FPSで動いているタイマーのどの時点でジャンプしたかを記録し最後に送信
フルスタックGoでスコア改ざんを防いだ話 | ponyo877 2026-02-18 | golang.tokyo #43 12 / 17
チート対策フロー図 | サーバでシミュレーション ゲーム終了 スコア保存完了 >< Hit x=10 x=22 x=49 x=41 シミュレーション → スコア計算 ジャンプ履歴 [10, 22, 41, 49] ※ ここでゲーム開始・終了時間から プレイ時間を算出→検証もやっている クライアントと同じゲームロジックを早回しして再現、サーバ側でスコア計算
フルスタックGoでスコア改ざんを防いだ話 | ponyo877 2026-02-18 | golang.tokyo #43 13 / 17
クライアント /サーバーでロジック共有 クライアントのゲームループ サーバでの検証 ゲームの状態 衝突計算 Browser WebAssembly Ebitengine Cloudflare Workers syumai/workers D1 common package
フルスタックGoでスコア改ざんを防いだ話 | ponyo877 2026-02-18 | golang.tokyo #43 14 / 17
commonパッケージで共有するもの ゲームの状態を表す構造体 • キャラクタの現在座標と速度 • 土管の隙間の配置 ゲームの状態から計算する以下のメソッド 衝突判定するメソッド スコア判定するメソッド
フルスタックGoでスコア改ざんを防いだ話 | ponyo877 2026-02-18 | golang.tokyo #43 15 / 17
サーバーサイドシミュレーション(コード) ゲーム開始時に出した土管シードから生成した乱 数で土管の隙間の位置を計算 LOOP: 下向きの速度から次のy座標を計算 重力加速度による下向きの速度を加える IF ジャンプ: 上向きの速度を加える IF 土管に衝突: 潜った土管の数がスコアになる RERURN
フルスタックGoでスコア改ざんを防いだ話 | ponyo877 2026-02-18 | golang.tokyo #43 16 / 17
追加の防止策 | プレイ時間検証 早すぎる ☺適切なプレイ時間☺ 遅すぎる 時間かけて攻略することの防止 ゲーム速度を落としの防止 60FPSでの最速の終了時間 30FPSでの最遅の終了時間 防止策の強化としてプレイ時間の検証も併せて実施 開始・終了時にクライアントからリクエストを遅らせサーバ側でプレイ時間を計算し適切 なプレイ時間か検証 time
フルスタックGoでスコア改ざんを防いだ話 | ponyo877 2026-02-18 | golang.tokyo #43 17 / 17
まとめ ブラウザゲームのスコア改ざん問題を以下の解決策で防いだ • スコアではなくjumpHistoryを送信 • サーバー側でシミュレーション クライアントとサーバでのGoのコード共有というレア実装で実現できた 理論的な詳細はZennにまとめの記事があり ブラウザゲームでハイスコアに挑 戦!https://flappy-ranking.pages.dev