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

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

ただいまの
回答率

87.59%

JSの変数の書き換え対策

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 3
  • VIEW 2,506

score 203

何をしたいか

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • papinianus

    2019/01/30 11:19

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

    キャンセル

  • gogojp

    2019/01/30 19:13

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

    キャンセル

回答 2

checkベストアンサー

+9

質問文で出てきた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 19:11

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

    キャンセル

  • 2019/01/30 19:33

    実際には詳しい人を味方につけるのが一番です。
    Twitterや勉強会で人脈を広げたり、ゲーム開発関係の書籍を読んでみるのも良いでしょう。
    あーだこーだ皆で案を出さないと何も作れませんからね。

    それと、棋譜提出みたいなのはチート対策としてはかなりの強度をほこると思いますが、
    「それに伴う開発や検証の負荷をどうするねん」というようなデメリットは依然として残っているわけで、机上の空論みたいなところがあります。
    結論チーターが「これはガードが硬い、割に合わんぞ」と思う位に掛けるだけでも十分だと思います。
    コスパ的な面でもネトゲ開発者同士の知人を増やす方向に目を向けてみて下さいね。

    キャンセル

+9

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る