1

ユーザーがスクリプトの背後にあるロジックを検査できないようにするために、ソースを完全に隠したり暗号化したりする方法はないようです。

ソースを表示する以外に、スクリプトの実行中にすべての変数やオブジェクトを操作することは可能ですか? ある程度は可能のようです。Chrome の開発者ツールまたは Firebug を使用すると、変数を簡単に編集したり、グローバル スコープで関数を呼び出したりすることもできます。次に、変数、インスタンス化されたオブジェクト内の関数、または自己呼び出しの無名関数についてはどうでしょうか? 次に例を示します。

var varInGlobal = 'On the global scope: easily editable';

function CustomConstructor()
{
    this.exposedProperty = 'Once instantiated, can be easily manipulated too.';

    this.func1 = function(){return func1InConstructor();}

    var var1InConstructor = 'Can be retrived by invoking func1 from an instantiated object';
                            // Can it be assigned a new value after this is instantiated?

    function func1InConstructor()
    {
        return var1InConstructor;
    }
}

var customObject = new CustomConstructor();

これをブラウザで実行した後:

// CONSOLE WINDOW
varInGlobal = 'A piece of cake!';

customObject.exposedProperty = 'Has new value now!';
customObject.var1InConstructor; // undefined: the variable can't be access this way
customObject.func1(); // This is the correct way

この段階で、ユーザーが customObject の変数「var1InConstructor」を編集することは可能ですか?

別の例を次に示します。

Javascript で作成された RPG ゲームがあります。ゲームのヒーローには、強さと敏捷性の 2 つのステータスがあります。キャラクターの最終的なダメージは、これら 2 つの統計を組み合わせて計算されます。プレイヤーがソースを調べることで、このロジックを見つけることができることは明らかです。

スクリプト全体が自己起動され、stats/calculate 関数がオブジェクトのコンストラクター内にあるため、インスタンス化された後は通常は到達できないと仮定しましょう。私の質問は、プレイヤーがゲームの実行中に (Firebug などを使用して) キャラクターの str と agi を編集して、すべてをスチームロールしてゲームを台無しにできるかどうかです。

4

6 に答える 6

3

変数var1InConstructorはレキシカル スコープ内でのみ表示されるため、通常の ECMAScript ルールでは再バインドできません。ただし、アレックス (および他の人) が正しく言うように、クライアントは信頼されるべきではありません。

変数が読み取り専用であるという仮定をユーザーが利用できるいくつかの方法を次に示します。

  1. JavaScript デバッガー (FireBug など) を使用して、該当するスコープ内のブレークポイントで停止している間に変数を再割り当てします。

  2. 元のソース コードをコピーして貼り付けますが、変数にアクセスできるセッターを追加します。ユーザーはプログラム全体をコピーして、実行に関するほとんどすべての仮定を無効にすることさえできます。

  3. 使用場所で値を変更または挿入します。元の変数を実際に更新することなく、悪用が可能になる場合があります (例: player.power = function () { return "godlike" })。

最終的に、クライアント側のプログラムでは、すべてのアクションを監査する中央機関 (サーバー) なしに、ユーザーのチートを完全に防ぐ方法はありません。 、敵の位置など。

読みやすく、編集しやすく、動的に実行できる JavaScript は、コンパイルされたアプリケーションよりもハッキング/いじりが容易です。難読化は可能ですが、誰かがカンニングしたい場合はそうします。

于 2013-03-06T00:08:38.323 に答える
3

これが答えを構成するとは思いません。逸話と見なされる可能性がありますが、コメントするには少し長いです。

この問題に関するコーディングの整合性に関して行うことはすべて、データがゲームのロジックの外で変更されていないことを確認する必要があることを中心に展開する必要があります。

私のゲーム開発の経験 (主に Flash を使用しますが、JavaScript と比較することもできます) では、可能な場合はすべてが握手であると考える必要があります。クライアントからサーバーにデータが届くことを期待している場合は、誰かが単に誤ったデータを送信する可能性を減らすために、なんらかの形式の通信経路があることを確認する必要があります。可能な限りサーバー側にデータを保存し、必要に応じてクライアント側コードを使用してデータを呼び出し、このデータ ストアを頻繁に更新します。

HTML ゲームでは、単純なタスクであっても、サーバー側に対してロジックの多くの抽象化を行う傾向があることがわかります。敵を攻撃する、アイテムを拾う、これらはサーバー側コード内の関数への呼び出しであり、接続がバックグラウンドでタイムアウトしている間、これらのゲームの一部でゲーム アニメーションが続行され、エラー メッセージが表示され、インターフェイスをサーバーの最後の既知の有効な状態に更新します。

フラッシュ環境を離れない限り、データを変更したり破損したりするアクセス権がなかったので、フラッシュはこの点でより簡単でした

于 2013-03-06T00:09:43.330 に答える
2

はい、クライアントからのデータを使用してサーバー側の状態を更新している場合、クライアントで実行されるものはすべて信頼できないはずです。

于 2013-03-06T00:01:42.790 に答える
0

あなたが提案したように、ロジック/クライアント側のコードを非表示にすることはできません。ソースを難読化することで、人々がソースを読むのを「難しく」することができますが、元に戻すのは非常に簡単です。

例からゲームを作成していると仮定すると、ネットワーク ゲームの最初のルールは「クライアントを信頼しない」ことです。サーバー上ですべてのゲーム ロジックを実行するか、サーバー上のすべての入力を検証する必要があります。最初に検証せずに、クライアントからの入力に基づいてゲームの状態を更新しないでください。

于 2013-03-06T00:06:00.193 に答える
0

変数を非表示にすることはできません。また、ユーザーが JavaScript に精通している場合、コンソールから変数の値を編集しなくても、スクリプトを簡単に編集できます。

于 2013-03-06T00:09:17.810 に答える
0

Ajax を使用して HTML に挿入された JS コードを手に入れるのは非常に困難ですが、制限もあります。最も注目すべきは、挿入された HTML で JS インクルードを使用できないことです。. . インラインJSのみ。

私は最近実際にそのいくつかを扱ってきましたが、デバッグするのは本当に面倒です。私が理解できる方法では、それを見ることも、ステップインすることも、ブレークポイントを追加することもできません。. . Firebug または Chrome の組み込みツールで。

しかし、他の人が言ったように。. . 私はまだそれが信頼できるとは考えていません。

于 2013-03-06T00:15:09.593 に答える