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
820
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
390
Go言語の2Dゲームエンジン Ebitengineの紹介
ponyo877
2
190
OGPer あなたのサイトに簡単にOGPを付けよう
ponyo877
0
69
ISUCON14感想戦で85万点まで頑張ってみた
ponyo877
1
1.2k
Goのwasmで笑い男に挑戦してみた
ponyo877
1
250
GoのWasmでのWebRTC P2Pの検証+α
ponyo877
0
160
Ebitengineの1vs1ゲーム WebRTCの活用
ponyo877
0
770
GoのWasmでWebRTC P2Pで通信する
ponyo877
0
570
Other Decks in Technology
See All in Technology
Claude Codeを組織で使いこなす— サーバサイドAIエージェント運用の実践知
techtekt
PRO
0
140
ルールやカスタム機能、どう使う?理想の出力を引き出すために今知りたいIBM Bob 5つの機能
muehara
0
160
string地獄を脱出する
sansantech
PRO
1
110
個人の発見を、組織の知恵に 〜生成AI活用を"探索"から"組織の仕組み"へ〜
kintotechdev
2
250
エンジニアは生成AIと どのように向き合うべきか? ことばの意味という観点から
verypluming
3
300
Claude Codeですべての日常業務を爆速化しよう!
minorun365
PRO
17
16k
Oracle AI Database@Azure:サービス概要のご紹介
oracle4engineer
PRO
6
1.8k
インフラが苦手でも大丈夫! 紙芝居 Kubernetes -WWGT 10周年編-
aoi1
1
310
Javaで学ぶSOLID原則
negima
1
240
オンコールの負荷軽減のためのBits Assistant 活用方法 / How to Use Bits Assistant to Reduce the Workload on On-Call Staff
sms_tech
1
360
A Harness for Behaviour: how to get AI to generate code that does what we intend, or "TDD in the age of AI"
xpmatteo
1
520
コードレビューを制するチームがソフトウェアデリバリーのフローを制す / Beyond Code Review: Distributing Its Responsibilities Across the SDLC
mtx2s
3
500
Featured
See All Featured
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
160
What's in a price? How to price your products and services
michaelherold
247
13k
WENDY [Excerpt]
tessaabrams
11
38k
Six Lessons from altMBA
skipperchong
29
4.3k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
230
A designer walks into a library…
pauljervisheath
211
24k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.3k
We Have a Design System, Now What?
morganepeng
55
8.2k
A Tale of Four Properties
chriscoyier
163
24k
A better future with KSS
kneath
240
18k
30 Presentation Tips
portentint
PRO
1
310
HDC tutorial
michielstock
2
680
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