0

HTML ページにロードされた JS をユーザーから隠す方法がないことはわかっていますが、私が準備した次の 2 つのプロジェクト (ゲーム) では、これはかなりの問題を引き起こします。勇敢なユーザーが単純に慰め、たとえば、さらに20の命を与えたり、スコアに100万を追加したりします。

コードの難読化はこれを困難にしますが、不可能ではありません。また、保護が必要なものをサーバー/PHPで実行することはまったく現実的ではないようです-いずれにせよ、取得されたデータは再び上書きされる可能性があります. 同様に、クロージャーを使用して変数を隠すことができますが、コンストラクター関数は引き続き表示されるため、上書き可能です。

(ブラウザゲームでこれが起こる可能性は低いと認識していますが、データセキュリティ/隠蔽はゲームよりもさらに進んでいるため、この問題は議論する価値があると考えました)

Flash はモバイル デバイス (同じ理由でアプレット OOQ) で動作する必要があるため使用できません。ランタイム コードの大きなチャンクが動的に生成されるため、1 つのゲームのエンジンに JS を使用する必要があるのが理想的です。変更されました。

JS/HTML ゲームでエンド ユーザーからプログラム ロジックを隠すための実用的または独創的なソリューションを誰かが持っていますか?

4

3 に答える 3

2

これに対する実際の解決策はありません。ユーザーを実際に抑止または遅らせることしかできません。ユーザーを止めることはできません。

私が過去に行うことを選択したのは、次のようなものです。

(function(){
    var Game = {
        // game object stuff.
    }
    // Game listeners
    window.addEventListener("load", function() {
        Game.init();
    });
})();

関数ラッパーは、Game 変数をグローバル名前空間から隠します (そのため、JavaScript コンソールでは、先に進んで変更するのは簡単ではありません)。お役に立てれば!

于 2013-04-02T00:07:59.123 に答える
1

サーバー側の検証は、クライアント側の整合性を保証する唯一の方法です。

ごめん :(

于 2013-04-02T00:10:12.830 に答える
1

ジョーは正しい考えを持っています。

あなたの解決策は、クロージャー内ですべてを実行することです。

どれもGame.player.num_lives;

var Game = (function () {

    var game = {},

        import = function (module_name, module_constructor) {
        },

        public_interface = {
            import : import,
            load   : load,
            start  : start
        };

    return public_interface;
}());

/* player.js */
Game.import("player", function () { /* ... */ });

実行.start();中以外は、ゲームの外部での相互作用はありません。

これにより、構造の点で物事がはるかに複雑になり、注入された各オブジェクトが必要な他の部分にアクセスできるようになります (最小限)。

シングルプレイヤーの場合、改ざんを行うのははるかに困難です。
マルチプレイヤーに関しては、これはサーバーをクライアントとサーバーの通信から保護するのにまったく役に立ちません。サーバーへの投稿を手作りすることによるリーダーボードのハッキング、または「自動起動」などは、サーバー上でゲームを実行し、クライアント入力を受け入れて検証するだけで処理する必要があります (そして、クライアント入力で次に何が起こるかをクライアントに伝えます)。応答)。

于 2013-04-02T00:28:25.367 に答える