質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

5284閲覧

JSの変数の書き換え対策

gogojp

総合スコア211

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

3クリップ

投稿2019/01/29 14:57

編集2019/01/29 14:57

#何をしたいか
自分の作ったブラウザゲームのスコア(JSの変数に格納)をXMLHttpRequestでPHPに送信し、PHPでランキングに反映させることをしています。
しかし、JSの変数はChromeなどのデベロッパーツールで中身を書き換えられてしまい、チートのようなことが可能になってしまいます。
また、外部サイトなどからPOSTで送信しても、ランキングが更新できてしまう致命的なバグもあります。
なので、自分が求めるものとしては以下のものです。

・スコアの更新はそのゲームのサイトからしか行えないようにする。つまり外部サイトからPOST送信しても処理されなくする。
・JSの変数の書き換え対策

自分なりに考えたのが、サイト訪問時に鍵のようなものを発行し、それがなければランキング登録ができないというものです。(書き換え対策できてない)
何かチートされないための工夫や解決策がご教授ください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2019/01/30 02:19

どういうゲームなんでしょうか?またログインはしないということでしょうか?
gogojp

2019/01/30 10:13

既に解決してましましたが、回答します。 ゲームはブラウザで遊べるテトリスです。 ログインシステムなどは特になく、アクセスすれば誰でもが遊べるフリーのものです。
guest

回答2

0

ベストアンサー

質問文で出てきた2つの方針はどちらも対策としては微妙です。
まだまだHTTPの仕様周りの理解が相当不足してるんじゃないかと思います。
もう少しHTTPやWebサーバ、ブラウザの仕様に関して勉強した方が良いでしょう。

・スコアの更新はそのゲームのサイトからしか行えないようにする。つまり外部サイトからPOST送信しても処理されなくする。

どうやって?
例えば「そのゲームのサイト」というのはHTTPリクエストのヘッダー内のRefererの事を指しているのでしょうか?

もしそうならRefererは「自己申告」ですので確認しても無駄です。
こういうスコア申請チートをしようとしてる輩が知らない訳無いでしょというレベルであり、
一度デベロッパーツール等で送信しているHTTPリクエストを確認して模倣するだけの単純作業で突破されます。

・JSの変数の書き換え対策

これもどうやって?
JavaScriptというのはブラウザ作ってるベンダーが各自エンジンを作っており、
WebサーバというのはJSファイルを送信して「読み込んで実行して下さいお願いします」ってお願いしている側です。

なのでフリーで配布されているChroniumを改造して自作ブラウザを作ったり、
間に改ざん用のスクリプトを挟み込んで実行するようなケースを考えると、
そもそもJavaScriptが意図通りに動いてくれる保証なんて何処にもありません。


という訳で、ローカルでゲームをさせて、
その結果だけ送って下さいという方式でハイスコア計算を行う仕組みはチートに対して無力です。
対策も何もありません。

te2jiさんが出してたURL内のハッシュを送れという対策も、
ハッシュを作るアルゴリズムがJS内にあるのにどうすんねんという感じですね。

なので、結局大抵のソシャゲは逐一サーバーへ接続してお伺いを立てるわけですね。
サーバー側に乱数含めて一切の権限をもたせることで、クライアントには表示しか任せない。
流行れば負荷は莫大なものになるので、ガチャでSSRをばらまくことでAWSのインスタンス代金を補填すると……

何かチートされないための工夫や解決策がご教授ください。

まぁ、私が思いつくのは棋譜の提出ですね。

将棋には棋譜があるように、ゲームをプレイすればその痕跡が残ります。
これを利用した手法が格ゲーのキーディスプレイ。
現行の格ゲーは両方のプレイヤーの操作内容が乗りますので、それの提出を迫れば改ざんはほぼ不可能になります。
例えうまく改ざんしたとしても、旧に相手プレイヤーが変な行動をし始めれば、後から検証してすぐに分かります。

つまり、格ゲーはキーディスプレイを読み込ませてゲームを再現させれば良いのです。

しかし、一般的なゲームには乱数が加わるものが多いですね。
一見チート対策は不可能なように思えますが、それにも抜け道があります。
例えばSFCのいただきストリートでは、SFCに予めどの順番でどの乱数が出るかという乱数表が用意されており、
ゲーム開始時にどの乱数でゲーム開始したか、要所要所でどの選択をしたのかという情報を元にして改ざん対策をしています。

サイコロを振って他のプレイヤーのお店に入る事が決定した瞬間にリセットボタンを押し、
ゲームをロードしてサイコロを振り直す不正を行ったとしても、出る目は同じなのでセーブ・ロードで簡単に未来は変えられません。

これを見習って、開始乱数表のアドレスとキャラクターの初期状態、操作内容を提出し、
サーバー内で実際にゲームを再生して妥当なら受理するという作りにするのが間違いないでしょう。
そのうち乱数固定チートの最適解棋譜提出みたいな事はされそうですが、時間は稼げるし、SFC版シムシティのマップ番号別タイムアタックみたいな遊び方は出来ると思います。

投稿2019/01/30 02:46

編集2019/01/30 03:04
miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gogojp

2019/01/30 10:11

詳しい回答ありがとうございます。 確かに自分はWebを作れるだけで、HTTPやサーバの仕様などの知識は乏しいです。 勉強しなければならないと感じました。 変数の改ざん対策は単純なものではないことを理解しました。 ご教授して頂いた、棋譜の提出を参考に改ざんされにくいシステムをどう作るか勉強していきたいと思います。 改めて詳しい回答ありがとうございました。
miyabi-sun

2019/01/30 10:33

実際には詳しい人を味方につけるのが一番です。 Twitterや勉強会で人脈を広げたり、ゲーム開発関係の書籍を読んでみるのも良いでしょう。 あーだこーだ皆で案を出さないと何も作れませんからね。 それと、棋譜提出みたいなのはチート対策としてはかなりの強度をほこると思いますが、 「それに伴う開発や検証の負荷をどうするねん」というようなデメリットは依然として残っているわけで、机上の空論みたいなところがあります。 結論チーターが「これはガードが硬い、割に合わんぞ」と思う位に掛けるだけでも十分だと思います。 コスパ的な面でもネトゲ開発者同士の知人を増やす方向に目を向けてみて下さいね。
guest

0

本格的な対策は、多分、思ってるより全然ノウハウが必要です。
一般的なチートの手法と対策について

簡易なチート対策としては、通常の Web アプリと同じく、referer + トークン チェックになると思います。あと、チェックサムかなぁ。。。

投稿2019/01/29 15:07

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問