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
0
15
フルスタックGoでスコア改ざんを防いだ話
ponyo877
February 18, 2026
Tweet
Share
More Decks by ponyo877
See All by ponyo877
全てGoで作るP2P対戦ゲーム入門
ponyo877
3
1.9k
filesystem風チャットchatsh開発で学んだGoの便利package紹介
ponyo877
1
340
Go言語の2Dゲームエンジン Ebitengineの紹介
ponyo877
2
160
OGPer あなたのサイトに簡単にOGPを付けよう
ponyo877
0
62
ISUCON14感想戦で85万点まで頑張ってみた
ponyo877
1
1.1k
Goのwasmで笑い男に挑戦してみた
ponyo877
1
220
GoのWasmでのWebRTC P2Pの検証+α
ponyo877
0
130
Ebitengineの1vs1ゲーム WebRTCの活用
ponyo877
0
720
GoのWasmでWebRTC P2Pで通信する
ponyo877
0
550
Other Decks in Technology
See All in Technology
Oracle Database@AWS:サービス概要のご紹介
oracle4engineer
PRO
3
1.4k
22nd ACRi Webinar - 1Finity Tamura-san's slide
nao_sumikawa
0
130
デザインもAIに任せる!iPhoneで行うiOS開発
zozotech
PRO
0
200
猫でもわかるKiro CLI(セキュリティ編)
kentapapa
1
210
【Oracle Cloud ウェビナー】[Oracle AI Database + AWS] Oracle Database@AWSで広がるクラウドの新たな選択肢とAI時代のデータ戦略
oracle4engineer
PRO
2
220
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
15
93k
コミュニティが変えるキャリアの地平線:コロナ禍新卒入社のエンジニアがAWSコミュニティで見つけた成長の羅針盤
kentosuzuki
0
140
StrandsAgentsで構築したAIエージェントにMCP Apps機能を追加してみた
kmiya84377
0
120
Context Engineeringが企業で不可欠になる理由
hirosatogamo
PRO
3
810
Prox Industries株式会社 会社紹介資料
proxindustries
0
200
22nd ACRi Webinar - NTT Kawahara-san's slide
nao_sumikawa
0
130
AIエージェントに必要なのはデータではなく文脈だった/ai-agent-context-graph-mybest
jonnojun
1
580
Featured
See All Featured
Paper Plane
katiecoart
PRO
0
46k
Designing for Performance
lara
611
70k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
72
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
0
150
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.4k
Discover your Explorer Soul
emna__ayadi
2
1.1k
Making Projects Easy
brettharned
120
6.6k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.1k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
260
Between Models and Reality
mayunak
1
200
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
77
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
69
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