ユーザーがスクリプトの背後にあるロジックを検査できないようにするために、ソースを完全に隠したり暗号化したりする方法はないようです。
ソースを表示する以外に、スクリプトの実行中にすべての変数やオブジェクトを操作することは可能ですか? ある程度は可能のようです。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 を編集して、すべてをスチームロールしてゲームを台無しにできるかどうかです。