0

重複の可能性:
スコアボードへの不正な送信の
防止 Javascript ゲームでの不正行為の防止

これを使用して、javascript変数をphp変数に渡す方法を見つけました:

window.location.href = ".../gameover.php?points=" + points+"&speed="+window.speed;

gameover.php私が使っ ているサイトでは

$_GET[speed]   // and 
$_GET[points]

私の変数にアクセスします。これらの値は、hiscores としてデータベースに保存されます。しかし、ここに私の問題があります: ユーザーが単に入力した場合

.../gameover.php?points=500000&speed=85

アドレスバーには、これらの変数も保存されます。

これを回避するのに役立つものを見つけましたが、それでも回避できます。私のメインページで「notcheated」Cookieを作成し、ユーザーがページにアクセスしてnotcheatedが設定されている場合、Cookieを破棄し、値をヒスコアに保存しますが、ユーザーがメインページにアクセスしてから上記のアドレスを入力すると、たとえばCookie は設定されていますが、彼はゲームをプレイしていないため、値も保存されます。

誰かが私のサイトを保護して、自分のスコアを入力できないようにするための提案はありますか?

編集: JavaScript の投稿でそれを実行しようとしましたが、うまくいきませんでした。多分私は何か間違ったことをしたのかもしれません。

4

3 に答える 3

0

少なくとも、POSTリクエストを送信することで、不正行為の可能性を制限することができます。これは、アドレスバーに表示されません:https ://stackoverflow.com/a/133997/1106393

function post_to_url(path, params, method) {
    method = method || "post"; // Set method to post by default, if not specified.

    // The rest of this code assumes you are not using a library.
    // It can be made less wordy if you use one.
    var form = document.createElement("form");
    form.setAttribute("method", method);
    form.setAttribute("action", path);

    for(var key in params) {
        if(params.hasOwnProperty(key)) {
            var hiddenField = document.createElement("input");
            hiddenField.setAttribute("type", "hidden");
            hiddenField.setAttribute("name", key);
            hiddenField.setAttribute("value", params[key]);

            form.appendChild(hiddenField);
         }
    }

    document.body.appendChild(form);
    form.submit();
}

しかし、偽造も非常に簡単であるため、これは不十分な解決策です。

他の解決策は、値を送信する前に値をエンコードすることです。したがって、それらが何を意味するのかは明らかではありません。たとえば、Googleの「JavascriptBase64 Encode/Decode」を確認してください。

value='1234'      // plain
value='MTIzNA=='  // base64-encoded

base64エンコーディング用のJavaScript関数はここにあります:https ://stackoverflow.com/a/133997/1106393

サーバーでは、次を使用します。

$speed = base64_decode($_POST['speed']);

http://www.php.net/manual/en/function.base64-decode.php

于 2012-05-21T11:00:40.223 に答える
0

ゲームが完全に JavaScript に基づいている場合は、パッチをいじる以外にできることはほとんどありません。上級ユーザーは常にハイスコアを取得します。

ゲームが (ゲーム中に) 時々 ajax を送信する場合、これらの情報を取得して$_SESSIONに入れることができるため、ゲームの更新にも使用できます。ajax呼び出しの間に異常な値が送信された場合、ユーザーは何らかの方法でハッキングしました。

最後に、有害な URL の代わりに、これらの$_SESSION値を使用できます。Cookie はユーザーのブラウザで無効にすることもできますが、あまり当てにしないでください。

于 2012-05-21T10:56:50.617 に答える
0

これを防ぐ唯一の方法は、サーバー側の PHP コード内でゲーム ロジックを実行することです。クライアントからサーバーにポイント値を送信すると、ユーザーは不正行為を行うことができます。

例:

/sell.php?money=10

上記は、10 を 1000000 に変更することでハッキングできます。代わりに、次のことを考慮してください。

/sell.php?itemid=1234

次に、サーバーはプレーヤーのインベントリからのアイテムの削除を処理し、適切な金額をアカウントに追加します。

于 2012-05-21T10:48:09.473 に答える