2

メソッドまたは関数がコンソールから直接呼び出されたことを検出する最良の方法を知りたいです。私が現在理解している限り、同一の関数呼び出しでそれを直接検出することはできませんが、関数の.call()および.apply()メソッドを使用して、thisオブジェクトを介して追加のデータを渡すことができます。

次のコード構造があるとします。

(function(){
    var Player = {money: 0};
    window.giveMoney = function(amount){
        if (this.legit !== true)
            throw new Error("Don't try to cheat!");

        Player.money += amount;
    }
})();

を使用して関数を呼び出すことができました

window.giveMoney.call({legit: true}, 300);

実際のコードでは、コンソールからの直接呼び出しと自分のコードを区別する必要がありますが、同じコードをコンソールから実行して目的の効果を達成することもできるため、これは明らかに確実ではありません。

両方の場所から関数を呼び出して、呼び出しの場所を区別できるようにする方法が必要です。それを行う方法がない場合、とにかく実行を試みて防止する最善の方法は何ですか? メソッドをまったく公開せず、すべてを単一の閉じられた無名関数内に保持するのが最善ですか?

4

3 に答える 3

3

グローバル アクセスを防ぐには、コードがクロージャー内にあることを確認してください。API を公開したい場合は、モジュール パターンを使用して公開できます。

閉鎖

(function() {
  var Game = {};
  Game.giveMoney = function(money) {
    console.log('Gave money (' + money + ')');
  };
})();

すべてのプライベートコードをIIFE (はすぐF unction E式を呼び出しました)でラップします。

モジュール

次に、クロージャーからカスタム関数のみを公開して、コンソールで使用できるようにします (もちろん監視付き)。

window.Game = (function() {
  var player = {
    money: 500;
  };
  player.giveMoney = function(money) {
    console.log('Gave money (' + money + ')');
    player.money += money;
  };
  player.takeMoney = function(money) {
    console.log('Took money (' + money + ')');
    player.money -= money;
  };

  return {
    giveMoney: function(money) {
      console.error('Don\'t Cheat! A fine was charged.');
      player.takeMoney(Math.floor(player.money / 0.05));
    }
  };
})();

window.Game.giveMoney(200);
于 2015-01-17T14:50:44.573 に答える
0

ブール変数を使用して、中央アクセス ポイントを介してすべての関数呼び出しをスプールできます。これは、呼び出しがコンソールからのものかどうかを示すインジケーターとして機能します。

var maths = {
    add: function(p1,p2)
    {
        console.log(p1,p2);
    }
}

var invoker = {
    invoke: function(fu,isconsole)
    {
        if(isconsole)
        {
            console.log("Called from console");
        }

        //invokes the function with all parameters intact
        fu;
    }
}

//Call without console
invoker.invoke(maths.add(2,3));

//Call with console
invoker.invoke(maths.add(2,3),true);

それが役に立てば幸い!!!

于 2015-01-17T16:18:53.923 に答える