[解決済み] noncesの作成方法と使用方法
質問内容
Webサイトを運営しているのですが、ゲームをプレイした回数でポイントがもらえる採点システムがあります。
これは、スコアリングのための http リクエストの整合性を証明するためにハッシュを使用しているので、ユーザーは何も変更できません。しかし、私が恐れていたように、誰かがそれを変更する必要はなく、ただ高得点を得る必要があると考え、ヘッダーも含めて http リクエストを複製してしまいました。
以前は、この攻撃は起こりそうもないと考えられていたため、私はこの攻撃から保護することを禁じられていました。しかし、実際に起こった今、私はそれを行うことができます。http リクエストはフラッシュ ゲームから発信され、その後 php によって検証され、php はそれをデータベースに入力します。
nonces が問題を解決することは間違いないのですが、それをどのように実装すればよいのかがよくわかりません。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;
}
関連
-
[解決済み】「Fatal error: Class 'MySQLi' not found "を解決するには?
-
[解決済み】 libapache2-mod-php7 パッケージが見つからない。
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] ある文字列が特定の単語を含んでいるかどうかを確認するにはどうすればよいですか?
-
[解決済み] YouTube APIからYouTubeビデオのサムネイルを取得する方法を教えてください。
-
[解決済み] PHPでHTML/XMLをパースして処理する方法とは?
-
[解決済み] どのような場合に '$this' よりも 'self' を使うべきですか?
-
[解決済み] PHPのstartWith()関数とendsWith()関数
-
[解決済み] PHPでパスワードをハッシュ化するためにbcryptを使用するにはどうすればよいですか?
-
[解決済み】FlashゲームのPHPベースのハイスコアテーブルをハッキングされないようにする最善の方法は何でしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] [Solved] Fatal error: メンバ関数prepare()のNULLでの呼び出し
-
[解決済み】SQLSTATE[42000]: 構文エラーまたはアクセス違反が発生しました。1064 SQL 構文にエラーがあります - PHP - PDO [重複]。
-
[解決済み】 $_SERVER['DOCUMENT_ROOT'] と $_SERVER['HTTP_HOST'] の違いについて]
-
[解決済み] $wpdb->update または $wpdb->insert を実行すると、引用符の前にスラッシュが追加される
-
[解決済み】「Fatal error: Class 'MySQLi' not found "を解決するには?
-
[解決済み] SQLSTATE[HY093]: 無効なパラメータ番号: パラメータが定義されていません
-
[解決済み】/var/www/htmlとは何ですか?[クローズド]
-
[解決済み】Netbeans 7.4 for PHPで「スーパーグローバルな$_POST配列に直接アクセスしないでください」という警告が発生する。
-
[解決済み] PHP - ストリームを開くのに失敗しました : そのようなファイルまたはディレクトリがありません。
-
[解決済み] mysql_field_nameを新しいmysqliに変更します。