42

だから私は読んでいて、CSRFトークンを持つことについて本当に混乱していました.リクエストごとに、またはちょうど1時間ごとに新しいトークンを生成する必要がありますか?

$data['token'] = md5(uniqid(rand(), true));
$_SESSION['token'] = $data['token'];

しかし、1 時間ごとにトークンを生成するほうがよいとしましょう。その場合、2 つのセッションが必要になります。トークン、有効期限、

そして、どうすればそれをフォームに進めることができますか?隠し値フォームに echo $_SESSION['token'] を配置して、送信時に比較するだけですか?

4

5 に答える 5

2

あなたの質問への答えは次のとおりです。

また、時限トークンにセッションを使用する必要はありません。サーバー時間とサーバー上の秘密鍵を使用するだけです。

しかし、1 時間ごとにトークンを生成するほうがよいとしましょう。その場合、2 つのセッションが必要になります。トークン、有効期限、

いいえ、時間枠のトークンを生成できるルーチンが必要です。時間を 30 分ごとに分割するとします。フォームで現在の 30 分間のトークンを 1 つ作成します。

その後、フォームが送信され、トークンを現在と前の 30 分間に対して検証します。したがって、トークンは 30 分から最大 1 時間有効です。

$token = function($tick = 0) use($secret, $hash) {
    $segment = ((int) ($_SERVER['REQUEST_TIME'] / 1800)) + $tick;
    return $hash($secret . $segment);
};
于 2012-05-06T00:40:19.203 に答える
1

owaspサイトでは、

攻撃者が盗まれたトークンを悪用する時間範囲が最小限であるため、要求ごとのトークンはセッションごとのトークンよりも安全です。ただし、これにより、ユーザビリティの問題が発生する可能性があります。

そして、次のように結論付けています。

CSRF トークンは次のようにする必要があります。

  • ユーザー セッションごとに一意です。
  • ひみつ
  • 予測不可能 (安全な方法で生成された大きなランダム値)。
于 2020-09-02T04:53:38.500 に答える
0

どちらの方法も使用できます。

1) 各リクエストのランダム トークン。また、同期されていないトークンの問題を解決するには、サーバー送信イベントhttp://www.w3.org/TR/eventsource/または websockets http://www.w3.org/TR/websockets/通信技術を使用して更新できますすべてのページのトークンをリアルタイムで。

2) ユーザー セッションごとにトークンを使用できます (1 時間ごとに行う必要はありません)。実装がより簡単です。同期に問題はありませんが、トークンが強すぎない場合は推測できます。もちろん、トークンが非常にランダムな場合、悪意のある人が実際にリクエスト フォージェリを実行するのは非常に困難になります。

PS 最初の方法は最も安全ですが、実装が難しく、より多くのリソースを使用します。

于 2012-05-07T21:03:20.310 に答える