1. ホーム
  2. php

[解決済み] noncesの作成方法と使用方法

2023-06-30 08:31:49

質問内容

Webサイトを運営しているのですが、ゲームをプレイした回数でポイントがもらえる採点システムがあります。

これは、スコアリングのための http リクエストの整合性を証明するためにハッシュを使用しているので、ユーザーは何も変更できません。しかし、私が恐れていたように、誰かがそれを変更する必要はなく、ただ高得点を得る必要があると考え、ヘッダーも含めて http リクエストを複製してしまいました。

以前は、この攻撃は起こりそうもないと考えられていたため、私はこの攻撃から保護することを禁じられていました。しかし、実際に起こった今、私はそれを行うことができます。http リクエストはフラッシュ ゲームから発信され、その後 php によって検証され、php はそれをデータベースに入力します。

nonces が問題を解決することは間違いないのですが、それをどのように実装すればよいのかがよくわかりません。nonce システムをセットアップする一般的で安全な方法は何ですか?

どのように解決するのですか?

それはとても簡単なことです。 それをやってくれるライブラリもあります。

  1. PHP Nonce ライブラリ
  2. OpenID Nonce ライブラリ

また、自分で書きたい場合は、とても簡単です。 を使えば ウィキペディアのページ を出発点として、擬似コードで。

サーバ側では、2つのクライアント呼び出し可能な関数が必要です。

getNonce() {
    $id = Identify Request //(either by username, session, or something)
    $nonce = hash('sha512', makeRandomString());
    storeNonce($id, $nonce);
    return $nonce to client;
}

verifyNonce($data, $cnonce, $hash) {
    $id = Identify Request
    $nonce = getNonce($id);  // Fetch the nonce from the last request
    removeNonce($id, $nonce); //Remove the nonce from being used again!
    $testHash = hash('sha512',$nonce . $cnonce . $data);
    return $testHash == $hash;
}

そしてクライアント側では

sendData($data) {
    $nonce = getNonceFromServer();
    $cnonce = hash('sha512', makeRandomString());
    $hash = hash('sha512', $nonce . $cnonce . $data);
    $args = array('data' => $data, 'cnonce' => $cnonce, 'hash' => $hash);
    sendDataToClient($args);
}

この関数は makeRandomString は本当に乱数か文字列を返すだけでよいのです。 より良い乱数であればあるほど、より良いセキュリティになります。 また、この関数はハッシュ関数に直接渡されるので、実装の詳細はリクエストごとに問題にならないことに注意してください。 クライアントのバージョンとサーバーのバージョンは一致する必要はない。 実際、100% 一致する必要があるのは hash('sha512', $nonce . $cnonce . $data); ... 以下は、適度に安全な makeRandomString 関数の例です...

function makeRandomString($bits = 256) {
    $bytes = ceil($bits / 8);
    $return = '';
    for ($i = 0; $i < $bytes; $i++) {
        $return .= chr(mt_rand(0, 255));
    }
    return $return;
}