2017-05-31 9 views
-1

私は、CSRF攻撃を防ぐためにCSRFトークンがどのように実装されているかを読んできました。 OWASPページ(https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet)およびさまざまな記事では、ページごとまたはセッションごとにランダムな一意のトークンを生成できると述べています。 (セッションあたり1回生成することをお勧めします)セッションごとのCSRFトークン情報の実装

トークンが1セッションにつき1つしか生成されない場合、そのセッションのトークンを使用するすべてのフォームページは、ページごとに同じトークンを持つ必要があります(それがリフレッシュされるといつでも)読み込まれますか?しかし、ほとんどの実装では、フォームの各ロードが異なるランダムトークンを持つことがわかりました。

どのように動作しますか?サーバー側で成功するたびに、セッションに存在するCSRFトークンが無効になっていますか?

私はこの権利を理解しているかどうかを知りたかっただけです。私はStackoverflowや他のブログで多くの同様の質問を読んだが、私はまだ混乱している。

ありがとうございます!

答えて

0

私はOWASPページを読んでいませんが、このコンテキストではセッションが最初にサイトに到着したときに開始し、セッションが終了するまで(非アクティブまたは一般的なサーバー定義の基準)または訪問者がブラウザを閉じる。

セッションが最初に開始されると、セッションにCSRFトークンが存在しないため、サーバーはトークンを内部データに格納します。 A セッションハンドルがブラウザに返され、ビジターがサイトの別のページを読み込んだりリロードしたりすると、セッションハンドルがサーバーに返され、サーバーはCSRFトークンが既に設定されていることを検出し、新しいものを作成するのではなく、したがって、すでにトークンが存在しない場合にのみ新しいトークンを作成する限り、トークンが無効になることを心配する必要はありません。

+0

フォームを含むページをリフレッシュすると、トークンはセッションのトークンが期限切れになるまで毎回同じになるでしょうか? – Kevin

+1

はい、ページを要求するときに必要なセッションハンドルをサーバーに渡す限りです。どの言語で作業していますか?たとえば、PHPでは、ページのコードの先頭近くで 'session_start()'を呼び出します。あなたのサイトが初めて訪れたときには、CRSFトークンは含まれないので、 '$ _SESSION'配列に追加します。 PHPが通常の方法で設定されていると仮定すると、セッションIDを含むクッキーがブラウザに送信され、ブラウザはサイト上の他のページリクエストのクッキーを返します。次に、 'session_start()'を呼び出すと、必要なCSRFトークンが取得されます。 – FKEinternet

0

CSRFシークレットがセッションごとに1回だけ生成されたとしても、ブラウザに送信されるシークレット(パスワードが塩分化され、ハッシュされる方法に似ています)をソルトしてハッシュすることによって、フォーム提出時に、サーバーはソルトトークンをその秘密と照合することができます(パスワードの確認方法と同様です)。そうすれば、各フォームはセッションごとの秘密以外の何かを覚えたり無効にしたりすることなく、独自のトークンを得ることができます。