人々がFlashゲームのPHPベースのハイスコア表をハッキングするのを止める最善の方法は何ですか


212

スコアの上限がなく、動きを再生するなどしてサーバー上のスコアを確認する方法がないアクションゲームについて話している。

私が本当に必要としているのは、Flash / PHPで可能な最も強力な暗号化と、私のFlashファイル以外からPHPページを呼び出されないようにする方法です。私は過去にいくつかの簡単な方法を試して、単一のスコアに対して複数の呼び出しを行い、チェックサム/フィボナッチシーケンスなどを完了し、Amayeta SWF EncryptでSWFを難読化しましたが、最終的にすべてハッキングされました。

- StackOverflowのレスポンスのおかげで私は今、アドビシステムズ社からいくつかのより多くの情報を発見したhttp://www.adobe.com/devnet/flashplayer/articles/secure_swf_apps_12.htmlhttps://github.com/mikechambers/as3corelib -私は私が考えます暗号化に使用できます。ただし、これでCheatEngineを回避できるかどうかわかりません。

AS2とAS3の両方に最適なソリューションが異なる場合、それらを知る必要があります。

主な問題はTamperDataやLiveHTTPヘッダーなどの問題のようですが、CheatEngineなどのより高度なハッキングツールもあることを理解しています(Mark Websterに感謝)


スコア制限を設定する必要があります。レベルごとに合計できなかった理由はありません...
mpm

最初のリンクはもう利用できません
Mike

回答:


415

これはインターネットゲームやコンテストの典型的な問題です。Flashコードはユーザーと連携して、ゲームのスコアを決定します。しかし、ユーザーは信頼されておらず、Flashコードはユーザーのコンピューターで実行されます。あなたはSOLです。攻撃者がハイスコアを偽造するのを防ぐためにできることは何もありません。

  • Flashは、バイトコードが十分に文書化されており、高級言語(Actionscript)を記述しているため、想像以上にリバースエンジニアリングが容易です。Flashゲームを公開するときは、ソースコードを公開します。それを知っているかどうか。

  • 攻撃者はフラッシュインタープリターのランタイムメモリを制御するため、プログラマブルデバッガーの使用方法を知っている人はいつでも(現在のスコアを含む)変数を変更したり、プログラム自体を変更したりできます。

システムに対する最も簡単な攻撃は、ゲームのHTTPトラフィックをプロキシ経由で実行し、ハイスコアのセーブをキャッチして、より高いスコアで再生することです。

たとえば、ゲームの起動時にクライアントに暗号化されたトークンを送信することで、次のような暗号化されたトークンを送信することで、各ハイスコアセーブをゲームの1つのインスタンスにバインドすることで、この攻撃をブロックできます。

hex-encoding( AES(secret-key-stored-only-on-server, timestamp, user-id, random-number))

(同じ効果を得るためにセッションCookieを使用することもできます)。

ゲームコードは、このトークンをエコーし​​てサーバーにハイスコアを保存します。しかし、攻撃者はゲームを再び起動してトークンを取得し、すぐにそのトークンを再生されたハイスコアセーブに貼り付けることができます。

次に、トークンまたはセッションCookieだけでなく、高スコア暗号化セッションキーもフィードします。これは128ビットのAESキーで、Flashゲームにハードコードされたキーで暗号化されています。

hex-encoding( AES(key-hardcoded-in-flash-game, random-128-bit-key))

ゲームがハイスコアをポストする前に、ハイスコア暗号化セッションキーを復号化します。これは、ハイスコア暗号化セッションキー復号化キーをFlashバイナリにハードコード化したためです。ハイスコ​​アのSHA1ハッシュとともに、この復号化されたキーでハイスコアを暗号化します。

hex-encoding( AES(random-128-bit-key-from-above, high-score, SHA1(high-score)))

サーバー上のPHPコードはトークンをチェックして、リクエストが有効なゲームインスタンスからのものであることを確認してから、暗号化されたハイスコアを復号化し、ハイスコアがハイスコアのSHA1と一致することを確認します(この手順をスキップした場合) 、復号化は単にランダムな、おそらく非常に高い、高いスコアを生成します)。

したがって、攻撃者はFlashコードを逆コンパイルし、すぐにAESコードを見つけます。これは親指のように突き出ていますが、メモリ検索とトレーサーを使用して15分で追跡されなかったとしても( "このゲームの私のスコアは666なので、メモリ内で666を見つけて、その値に触れるすべての操作をキャッチします-あら、ハイスコア暗号化コード!)セッションキーがあれば、攻撃者はFlashコードを実行する必要さえありません。彼女はゲーム起動トークンとセッションキーを取得し、任意のハイスコアを送り返すことができます。

これで、ほとんどの開発者はあきらめます---次のようにして、攻撃者に2か月間あざけるか、いじくりまわしてください。

  • XOR演算によるAESキーのスクランブル

  • キーバイト配列をキーを計算する関数で置き換える

  • バイナリ全体での偽のキー暗号化とハイスコア投稿の散乱。

これはすべて時間の無駄です。言うまでもありませんが、SSLはあなたを助けることにもなりません。2つのSSLエンドポイントのいずれかが悪である場合、SSLはユーザーを保護できません。

ハイスコ​​ア詐欺を実際に減らすことができるいくつかの事柄は次のとおりです。

  • ゲームをプレイするためにログインを要求し、ログインにセッションCookieを生成させ、同じセッションでの複数の未処理のゲームの起動、または同じユーザーの複数の同時セッションを許可しない。

  • これまでにプレイした実際のゲームよりも短い持続時間のゲームセッションからのハイスコアを拒否します(より洗練されたアプローチについては、平均ゲーム持続時間より2標準偏差未満持続するゲームセッションのハイスコアを「隔離」してみてください)。サーバーサイドでゲーム時間を追跡していることを確認してください。

  • ゲームを1〜2回プレイしただけのログインからのハイスコアを拒否または隔離します。これにより、攻撃者は、作成するログインごとに合理的なゲームプレイの「紙の証跡」を作成する必要があります。

  • "ハートビート"はゲームプレイ中にスコアリングするため、サーバーは1回のゲームプレイの存続期間中のスコアの増加を確認できます。適切なスコア曲線に従わないハイスコアを拒否します(たとえば、0から999999にジャンプします)。

  • ゲームプレイ中の「スナップショット」ゲームの状態(弾薬の量、レベル内の位置など)。記録された中間スコアと後で照合できます。まず、このデータの異常を検出する方法を用意する必要はありません。収集するだけで、物事がおかしい場合は、戻って分析できます。

  • セキュリティチェックに失敗したユーザーのアカウントを無効にします(たとえば、検証に失敗した暗号化されたハイスコアを送信するなど)。

ただし、ここではハイスコア詐欺を阻止するだけであることに注意してください。防ぐためにできることは何もありません。あなたのゲームのラインにお金があるなら、誰かがあなたが思いつくシステムを打ち負かそうとしています。目的はこの攻撃を止めることではありません。それは、単にゲームを本当に上手にしてそれを打ち負かすよりも攻撃をより高価にすることです。


23
私はオンラインゲームコミュニティを作り、最高のスコアラーだけでなく上位10パーセンタイルスコアに報酬を与えるように報酬システム全体を設計しました。それがうまくいったので、問題を回避することも役立ちます!
グレープ

1
いいね!つまり、ゲームサーバーで実行されていない(または少なくともサーバーでサニティチェックが実行されている)場合を除き、不正行為を防ぐことはできません。マルチプレイヤーシューターの同じ問題:より良い照準を生成するようにクライアントが変更された場合、ネットワークプロトコルでそれを防ぐことはできません。
Kerrek SB、2011

3
すべてのユーザーアクションをログに記録してサーバーで再生し、ハイスコアを確認/決定することもできると思います
I3ck

25

あなたは間違った質問をしているかもしれません。あなたはハイスコアリストを上に行くために人々が使用している方法に集中しているように見えますが、特定の方法をブロックすることはこれまでのところです。私はTamperDataの経験がないので、話せません。

あなたが尋ねる必要のある質問は、「提出されたスコアが有効で本物であることをどのように確認できますか?」です。それを行う具体的な方法はゲームに依存します。非常に単純なパズルゲームの場合、特定の開始状態と終了状態になった一連の動きとともにスコアを送信し、同じ動きを使用してサーバー側でゲームを再実行します。示されたスコアが計算されたスコアと同じであることを確認し、一致する場合のみスコアを受け入れます。


2
これは、私が過去にも投票システムに使用した手法です。不正行為を防ぐ方法はありませんが、不正行為の有無を確認できるように行動を記録することができます。私たちの投票システムでは、タイムスタンプとIPアドレスを格納するために使用しました。[続き]
ルーク、

1
これにより、少なくとも不正行為のパターンを確認し、必要に応じて資格を剥奪することができます。私たちは何度もそれをうまく使ってきました。
ルーク

19

これを行う簡単な方法は、ハイスコア値の暗号化ハッシュとスコア自体を提供することです。たとえば、HTTP GETを介して結果を投稿する場合:http : //example.com/highscores.php?score=500&checksum=0a16df3dc0301a36a34f9065c3ff8095

このチェックサムを計算するときは、共有秘密を使用する必要があります。このシークレットはネットワーク経由で送信してはなりませんが、PHPバックエンドとフラッシュフロントエンドの両方でハードコーディングする必要があります。上記のチェックサムは、スコア「500」の前に文字列「secret」を付加し、それをmd5sumで実行することによって作成されました。

このシステムは、ユーザーが任意のスコアを投稿することを防ぎますが、ユーザーが以前に計算したスコアとハッシュの組み合わせを再投稿する「リプレイアタック」を防ぐことはできません。上記の例では、500のスコアは常に同じハッシュ文字列を生成します。このリスクの一部は、ハッシュされる文字列にさらに多くの情報(ユーザー名、タイムスタンプ、IPアドレスなど)を組み込むことで軽減できます。これによりデータの再生が妨げられることはありませんが、データのセットが一度に1人のユーザーに対してのみ有効であることは保証されます。

防ぐために任意の発生からリプレイ攻撃を、チャレンジレスポンス方式のいくつかのタイプは、次のような、作成する必要があります。

  1. フラッシュゲーム(「クライアント」)は、パラメーターなしでhttp://example.com/highscores.phpの HTTP GETを実行します。このページは2つの値を返します。ランダムに生成されたソルト値と、共有シークレットと組み合わせたそのソルト値の暗号ハッシュです。このソルト値は、保留中のクエリのローカルデータベースに保存する必要があり、おそらく1分後に「期限切れ」になるようにタイムスタンプが関連付けられている必要があります。
  2. フラッシュゲームはソルト値と共有シークレットを組み合わせ、ハッシュを計算して、これがサーバーから提供されたものと一致することを確認します。このステップは、ソルト値がサーバーによって実際に生成されたことを確認するため、ユーザーによるソルト値の改ざんを防ぐために必要です。
  3. フラッシュゲームは、ソルト値と共有シークレット、ハイスコア値、およびその他の関連情報(ニックネーム、IP、タイムスタンプ)を組み合わせ、ハッシュを計算します。次に、この情報を、HTTP GETまたはPOSTを介して、salt値、ハイスコア、およびその他の情報とともにPHPバックエンドに送り返します。
  4. サーバーは、クライアントと同じ方法で受信した情報を組み合わせ、ハッシュを計算して、これがクライアントから提供されたものと一致することを確認します。次に、保留中のクエリリストにリストされているソルト値がまだ有効であることも確認します。これらの両方の条件に該当する場合、高スコアを高スコアテーブルに書き込み、署名された「成功」メッセージをクライアントに返します。また、保留中のクエリリストからソルト値を削除します。

共有シークレットがユーザーにアクセス可能になると、上記の手法のセキュリティが危険にさらされることに注意してください。

別の方法として、クライアントがHTTPSを介してサーバーと通信するように強制し、クライアントだけがアクセスできる特定の認証局によって署名された証明書のみを信頼するように事前構成することで、この往復の一部を回避できます。 。


11

私はtpqfの発言を気に入っていますが、不正行為が発見されたときにアカウントを無効にするのではなく、ハニーポットを実装して、ログインするたびにハッキングされたスコアを表示し、トロールとしてマークされたことを疑わないようにします。「phpBB MOD Troll」のグーグルとあなたは独創的なアプローチを見るでしょう。


1
このアプローチの問題は、これらのチートがメッセージボードなどで互いに自慢することです。
Iain

7
同意しません。これは非常に賢いアプローチのように聞こえます。
bzlm 2009年

4

受け入れられた回答でtqbfは、スコア変数のメモリ検索を実行できると述べています(「私のスコアは666なので、メモリ内の番号666を探します」)。

これを回避する方法があります。ここにクラスがあります:http : //divillysausages.com/blog/safenumber_and_safeint

基本的に、スコアを保存するオブジェクトがあります。セッターでは、渡した値に乱数(+および-)を乗算し、ゲッターでは、保存された値をランダム乗数で割って、元の値に戻します。シンプルですが、メモリ検索の停止に役立ちます。

また、PushButtonエンジンの背後にいる、ハッキングと闘うためのさまざまな方法について話している連中のビデオをチェックしてください。http//zaa.tv/2010/12/the-art-of-hacking-flash- games /。彼らはクラスの背後にあるインスピレーションでした。


4

私は一種の回避策を作りました...私はスコアが増加する所与を与えました(あなたは常に+1スコアを得る)。最初に、ランダムな数値(14としましょう)からカウントを開始し、スコアを表示するとき、スコアvarマイナス14を表示しました。これは、クラッカーがたとえば20を探している場合、それを見つけられない(それはメモリ内で34になります)。次に、次のポイントが何であるかがわかっているので...次のポイントがどうあるべきかのハッシュを作成するために、Adobe暗号ライブラリを使用しました。スコアをインクリメントする必要がある場合、インクリメントされたスコアのハッシュがハッシュと等しいかどうかを確認します。クラッカーがメモリ内のポイントを変更した場合、ハッシュは等しくありません。私はサーバー側の検証を実行し、ゲームとPHPで異なるポイントを獲得したとき、不正行為が関与していたことを知っています。ここに私のコードのスニペットがあります(私はAdobe Crypto libraty MD5クラスとランダム暗号化ソルトを使用しています。callPhp()は私のサーバー側の検証です)

private function addPoint(event:Event = null):void{
            trace("expectedHash: " + expectedHash + "  || new hash: " + MD5.hash( Number(SCORES + POINT).toString() + expectedHashSalt) );
            if(expectedHash == MD5.hash( Number(SCORES + POINT).toString() + expectedHashSalt)){
                SCORES +=POINT;
                callPhp();
                expectedHash = MD5.hash( Number(SCORES + POINT).toString() + expectedHashSalt);
            } else {
                //trace("cheat engine usage");
            }
        }

この手法とSWFの難読化を使用して、クラッカーを停止できました。また、スコアをサーバー側に送信するときは、独自の小さな暗号化/復号化機能を使用します。次のようなもの(サーバー側のコードは含まれていませんが、アルゴリズムを確認してPHPで記述できます):

package  {

    import bassta.utils.Hash;

    public class ScoresEncoder {

        private static var ranChars:Array;
        private static var charsTable:Hash;

        public function ScoresEncoder() {

        }

        public static function init():void{

            ranChars = String("qwertyuiopasdfghjklzxcvbnm").split("")

            charsTable = new Hash({
                "0": "x",
                "1": "f",
                "2": "q",
                "3": "z",
                "4": "a",
                "5": "o",
                "6": "n",
                "7": "p",
                "8": "w",
                "9": "y"

            });

        }

        public static function encodeScore(_s:Number):String{

            var _fin:String = "";

            var scores:String = addLeadingZeros(_s);
            for(var i:uint = 0; i< scores.length; i++){
                //trace( scores.charAt(i) + " - > " + charsTable[ scores.charAt(i) ] );
                _fin += charsTable[ scores.charAt(i) ];
            }

            return _fin;

        }

        public static function decodeScore(_s:String):String{

            var _fin:String = "";

            var decoded:String = _s;

            for(var i:uint = 0; i< decoded.length; i++){
                //trace( decoded.charAt(i) + " - > "  + charsTable.getKey( decoded.charAt(i) ) );
                _fin += charsTable.getKey( decoded.charAt(i) );
            }

            return _fin;

        }

        public static function encodeScoreRand(_s:Number):String{
            var _fin:String = "";

            _fin += generateRandomChars(10) + encodeScore(_s) + generateRandomChars(3)

            return _fin;
        }

        public static function decodeScoreRand(_s:String):Number{

            var decodedString:String = _s;
            var decoded:Number;

            decodedString = decodedString.substring(10,13);         
            decodedString = decodeScore(decodedString);

            decoded = Number(decodedString);

            return decoded;
        }

        public static function generateRandomChars(_length:Number):String{

            var newRandChars:String = "";

            for(var i:uint = 0; i< _length; i++){
                newRandChars+= ranChars[ Math.ceil( Math.random()*ranChars.length-1 )];
            }

            return newRandChars;
        }

        private static function addLeadingZeros(_s:Number):String{

            var _fin:String;

            if(_s < 10 ){
                 _fin = "00" + _s.toString();
            }

            if(_s >= 10 && _s < 99 ) {
                 _fin = "0" + _s.toString();
            }

            if(_s >= 100 ) {
                _fin = _s.toString();
            }           

            return _fin;
        }


    }//end
}

次に、変数を他の偽変数と一緒に送信すると、途中で失われます...小さなフラッシュゲームだけでは多くの作業が必要になりますが、賞品が含まれる場合、一部の人は貪欲になります。助けが必要な場合は、私にPMを書いてください。

乾杯、イコ


3

既知の(秘密)可逆鍵を使用した暗号化は、最も簡単な方法です。私はすべてASを使用しているわけではないので、どのような種類の暗号化プロバイダーが存在するのかわかりません。

ただし、ゲームの長さ(暗号化されたもの)やクリック数などの変数を含めることもできます。

このようなものはすべてリバースエンジニアリングすることできるので、大量のジャンクデータを投入して、人々の香りを落とすことを検討してください。

編集:いくつかのPHPセッションでもチャックする価値があるかもしれません。ゲームの開始をクリックしてセッションを開始し、(この投稿へのコメントにあるように)時間を記録します。彼らがスコアを提出するとき、あなたは彼らが実際にオープンゲームを持っていること、そして彼らがスコアを提出するのが早すぎたり大きすぎたりしていないことを確認できます。

スカラを計算して、1秒あたりの最大スコアが何分かを確認することをお勧めします。

これらのどちらも回避できないわけではありませんが、Flashにないロジックを用意して、人々がそれを見ることができるようにすると役立ちます。


このアプローチに従う人は、時間も含め、時間を検証する必要があります。そうしないと、攻撃をリプレイすることに対して脆弱になります。
トムリッター

3

私の経験では、これはプログラミングの問題ではなく、ソーシャルエンジニアリングの問題として取り組むのが最善です。チートを不可能にすることに焦点を当てるのではなく、チートするインセンティブを取り除くことによって、それを退屈にすることに焦点を合わせます。たとえば、主なインセンティブが公に見える高得点である場合、高得点が表示されたときに遅延を設定するだけで、不正行為者の正のフィードバックループが削除され、不正行為を大幅に減らすことができます。


12
しかし、それによって実際のプレーヤーのインスタントハイスコアの肯定的なフィードバックも削除されるため、ゲームプレイの質が低下します。
Chris Garrett、

3

クライアントが返すデータは信頼できません。検証はサーバー側で実行する必要があります。私はゲーム開発者ではありませんが、ビジネスソフトウェアを作っています。どちらの場合も、お金が関わる可能性があり、人々はクライアント側の難読化手法を破ります。

おそらく、定期的にデータをサーバーに送り返し、検証を行います。アプリケーションが存在する場所であっても、クライアントコードに焦点を当てないでください。


2

あなたのハイスコアシステムが、Flashアプリケーションがネットワークを介して暗号化されていない/署名されていないハイスコアデータを送信するという事実に基づいている場合はいつでも、傍受および操作/再生することができます。それから答えは次のとおりです。ハイスコアデータを暗号化(きちんと!)または暗号で署名します。少なくとも、SWFファイルから秘密鍵を抽出する必要があるため、ハイスコアシステムを解読することが難しくなります。多くの人はおそらくあきらめるでしょう。一方、鍵を取り出してどこかに投稿するのは、1人の人だけです。

実際のソリューションでは、Flashアプリケーションとハイスコアデータベース間の通信が増えるため、後者は特定のスコアがある程度現実的であることを検証できます。これはあなたがどんな種類のゲームを持っているかによっておそらく複雑です。


2

SWFを簡単に逆コンパイルできるため、完全にハッキング不可能にする方法はありません。熟練した開発者のハッカーは、コードをたどって、使用する暗号化システムをバイパスする方法を見つけることができます。

TamperDataなどの単純なツールを使用して子供たちの不正行為を止めたいだけの場合は、起動時にSWFに渡す暗号化キーを生成できます。次に、http://code.google.com/p/as3crypto/などを使用して、ハイスコアを暗号化してから、PHPコードに渡します。次に、データベースに保存する前に、サーバー側で暗号化を解除します。


2

あなたはいわゆる「クライアントの信頼」問題について話している。クライアント(このキャッシュでは、ブラウザーで実行されているSWF)は、設計された動作をしているためです。ハイスコ​​アを保存します。

問題は、「スコアの保存」リクエストがフラッシュムービーからのものであり、任意のHTTPリクエストからのものではないことを確認することです。このための可能な解決策は、要求時にサーバーで生成されたトークンを(flasmを使用して)SWFにエンコードすることです。サーバーがそのスコアを保存すると、トークンは期限切れになり、要求に使用できなくなります。

これの欠点は、ユーザーがフラッシュムービーのロードごとに1つのハイスコアしか送信できないことです。新しいスコアを再生する前に、SWFを強制的に更新/再ロードする必要があります。


2

通常、ゲームセッションの「ゴーストデータ」をハイスコアエントリに含めます。したがって、レーシングゲームを作成している場合は、リプレイデータを含めます。多くの場合、リプレイ機能またはゴーストレーシング機能用のリプレイデータが既にあります(最後のレースと対戦するか、リーダーボードでゴーストオブデュード#14と対戦します)。

これらをチェックすることは非常に手作業ですが、コンテストの上位10エントリが合法かどうかを確認することが目的である場合、これは他の人がすでに指摘しているセキュリティ対策の武器に役立つ追加になります。

目標がハイスコアリストを最後までオンラインで維持することであり、誰もそれらを見る必要がない場合、これはあまり役に立ちません。


2

新しい人気のアーケードMODが行う方法は、フラッシュからphpにデータを送信し、フラッシュ(またはリロード)に戻してから、phpに戻すというものです。これにより、データを比較したり、ポストデータ/復号化ハックなどをバイパスしたりすることができます。これを行う1つの方法は、phpからフラッシュに2つのランダム化された値を割り当て(リアルタイムフラッシュデータグラバーを実行している場合でも取得または表示できない)、数式を使用してランダムな値でスコアを追加し、それを使用してチェックすることです最後にphpに移動したときにスコアが一致するかどうかを確認するために、同じ式を逆にします。これらのランダムな値は決して表示されないだけでなく、トランザクションが実行されるタイミングと、

これは私に尋ねればかなり良い解決策のようですが、誰かがこの方法を使用して何か問題を見ていますか?またはそれを回避する方法はありますか?


Wireshark。Wiresharkは常に穴です。
aehiilrs 2010

ええ、私はこの正確な方法を試してみました...まあ...私はどういうわけか合法的なユーザーを詐欺師としてログに記録しました(この機能は私のコンピューターでは常に機能しますが、他の一部のコンピューターでは機能しません)...不正行為を許可します...上記のチェックに合格しなかった人をログに記録し、スコアが非常に高い人をログに記録してから、手動で虐待します...スコアを作成することによって* -1:P彼らは通常、冗談をよく聞きます。
Sigtran

1
「これを行う1つの方法は、phpからフラッシュに2つのランダム化された値を割り当てることです(リアルタイムフラッシュデータグラバーを実行している場合でも、取得または確認できません)」-教えてください、phpから値を渡す方法はありますかFirebugや他のツールで監視されずにフラッシュしますか?
mkto

2

追加するスコアをゲームが登録するたびにRegisterScore(score)のような関数を呼び出し、それをエンコードしてパッケージ化し、phpスクリプトに文字列として送信するのが最も簡単な方法だと思います。phpスクリプトはそれを正しくデコードする方法を知っています。スコアを強制しようとすると解凍エラーが発生するため、これによりphpスクリプトへの呼び出しが停止します。


2

すべてのゲームロジックをサーバー側に保持することによってのみ可能です。これは、ユーザーの知識なしにスコアを内部的に保存することもできます。経済的および科学的な理由により、人類はこの理論をターンベースを除くすべてのゲームタイプに適用することはできません。たとえば、物理をサーバー側で維持することは計算コストが高く、手の速度として応答するのが困難です。チェスをプレイしている間でも、誰でもAIチェスのゲームプレイを対戦相手に合わせることができます。したがって、より優れたマルチプレイヤーゲームには、オンデマンドの創造性も含まれている必要があります。


1

あなたが望むものを達成することは実際には不可能です。Flashアプリの内部は常に部分的にアクセス可能です。特にCheatEngineのようなものを使用する方法を知っている場合、つまり、ウェブサイトとブラウザー<->サーバーの通信がどれほど安全であっても、比較的簡単に克服できます。


1

AMFPHP経由でバックエンドと通信するのは良い考えかもしれません。それは少なくとも怠惰な人がブラウザコンソールを介して結果をプッシュしようとすることを思いとどまらせるはずです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.