2

私は、10 秒ごとにiインクリメントされるブラウザ ゲームを作成しています。ポイント アルゴリズムはi、付与されるポイント数を決定するために使用します。(私にとって)これを行う明白な方法はsetInterval(10000)、タイマーに使用し、関数内でポイント計算を実行することです。

JavaScript インジェクションが増加し、ユーザーが実際よりも長くプレイしているとアプリに思わせるのを防ぐにはどうすればよいですか?i

バックエンドとして Firebase を使用しています。PHP プログラマーとして、私は通常、プレイヤーがポイントを送信するときに、開始時間と終了時間をチェックしてサーバー側で検証するだけです。Firebaseでもこれを行うことができると思うので、おそらく自分の質問に答えただけです...

それでも、JavaScript インジェクションを防ぐ方法はありますか? (サーバー側の検出ではなく、防止)。

4

3 に答える 3

3

変数を本質的に非公開にすることができます。つまり、ユーザーが単純な JS インジェクションで変数を変更することは不可能になります。しかし、誰かがデバッガーで Javascript を傍受したり、クライアントとサーバー間の通信を傍受したり、その他のあらゆる種類の操作を行ったりするのを止めることはできません。

変数を非公開にするには、変数を関数内に含めてその関数を実行し、その変数を参照する関数を含む何かを返すだけです。これは と呼ばれclosureます。やり方はとても簡単です。

このフィドルには、counter1 秒ごとに更新される変数 (10 秒ごとではありません。急いでいます! :-) ) とbasePoints 、現在のスコアに追加される別の変数があります。

一般に公開されているのは、basePoints 値に追加できる機能ですが、カウンターに追加できるものはありません。(デバッガーのように) JS エンジンの内部に入らずにそれを行うことはできないと思います。主なポイントは、Javascript 内でcounter変数を更新する方法がないということです。

var app = this.app = (function() {
    var counter = 0;
    var basePoints = 0;
    var div = document.getElementById("score");
    var addPoints = function(nbr) {
        basePoints += nbr;
        display();            
    };

    document.getElementById("add20").onclick = function() {
        addPoints(20);            
    };

    var display = function() {
        var points = counter + basePoints;
        div.innerHTML = points + " points";
    };

    setInterval(function() {
        counter += 1; 
        display();
    }, 1000);

    return {
        addPoints: addPoints
    };
}());​
于 2012-07-17T20:42:03.653 に答える
2

変数が関数コンテキストの内部にあり、グローバル変数ではなく、グローバルスコープからアクセスできないことを確認するだけで、ブックマークレットなどを介した変数の単純な操作を防ぐことができます。これは、次のような自己実行関数コンテキストに配置するのと同じくらい簡単です。

(function() {
    var i;

    // code that uses i

    setTimeout(function() {
        more code that uses i
    }, 1000);
})();

この場合、その最初の関数ブロック内のコードのみが変数に到達できますi

他の人が言っているように、これは、ページが実行する前にソースjavascriptを実際に変更したり、デバッガーで中断してそこで操作したりするより複雑な操作を防ぐ方法がないため、それらを防ぐ方法はありませんが、最も単純な操作を防ぐことはできません。ページにアクセスして変数を変更する方法(ブックマークレットなど)。

于 2012-07-17T20:44:52.137 に答える
1

クライアント側で値を計算し、その後サーバー側にプッシュすることによって、あらゆる種類のハイスコアのハッキングを防ぐ方法は事実上ありません。ハッキングを多かれ少なかれ複雑にすることができるのは、難読化とさまざまなトリックだけですが、それを完全に防ぐことはできません。そのため、サーバー側の検証またはイベントよりも優れたサーバー側の計算が優先されます。

于 2012-07-17T20:10:10.367 に答える