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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
ponyo877
February 18, 2026
Technology
740
0
Share
フルスタックGoでスコア改ざんを防いだ話
ponyo877
February 18, 2026
More Decks by ponyo877
See All by ponyo877
全てGoで作るP2P対戦ゲーム入門
ponyo877
3
2k
filesystem風チャットchatsh開発で学んだGoの便利package紹介
ponyo877
1
370
Go言語の2Dゲームエンジン Ebitengineの紹介
ponyo877
2
180
OGPer あなたのサイトに簡単にOGPを付けよう
ponyo877
0
66
ISUCON14感想戦で85万点まで頑張ってみた
ponyo877
1
1.2k
Goのwasmで笑い男に挑戦してみた
ponyo877
1
230
GoのWasmでのWebRTC P2Pの検証+α
ponyo877
0
150
Ebitengineの1vs1ゲーム WebRTCの活用
ponyo877
0
760
GoのWasmでWebRTC P2Pで通信する
ponyo877
0
560
Other Decks in Technology
See All in Technology
Standards et agents IA : un tour d’horizon de MCP, A2A, ADK et plus encore
glaforge
0
140
20260423_執筆の工夫と裏側 技術書の企画から刊行まで / From the planning to the publication of technical book
nash_efp
3
380
2026年、知っておくべき最新 サーバレスTips10選/serverless-10-tips
slsops
13
5.1k
Bill One 開発エンジニア 紹介資料
sansan33
PRO
6
18k
基盤を育てる 外部SaaS連携の運用
gamonges_dresscode
1
110
ぼくがかんがえたさいきょうのあうとぷっと
yama3133
0
190
みんなの「データ活用」を支えるストレージ担当から持ち込むAWS活用/コミュニティー設計TIPS 10選~「作れる」より、「続けられる」設計へ~
yoshiki0705
0
240
AgentCore×VPCでの設計パターンn選と勘所
har1101
3
270
Good Enough Types: Heuristic Type Inference for Ruby
riseshia
0
120
最新の脅威動向から考える、コンテナサプライチェーンのリスクと対策
kyohmizu
1
700
AI時代における技術的負債への取り組み
codenote
1
1.4k
Amazon S3 Filesについて
yama3133
2
210
Featured
See All Featured
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
150
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
ラッコキーワード サービス紹介資料
rakko
1
3M
How to train your dragon (web standard)
notwaldorf
97
6.6k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.3k
The untapped power of vector embeddings
frankvandijk
2
1.7k
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
1
520
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
180
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
520
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.4k
Color Theory Basics | Prateek | Gurzu
gurzu
0
290
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.8k
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