19

ページの読み込みごとにランダムなトークンを生成し、それをセッションに入れ、トークンを次のようにタグ属性にバインドするだけで、アプリケーションにCSRF保護を構築しました。<body>

<body data-csrf-token="csrf_GeJf53caJD6Q5WzwAzfy">

次に、すべてのフォーム アクションまたは ajax リクエストで、body タグからトークンを取得して送信します。

大きな問題を除けば、これはうまく機能します。ユーザーがアプリケーションの複数のタブを開いており、トークンの衝突が発生しています。たとえば、ユーザーが最初のページをロードしてトークンを生成し、次にタブを切り替えて別のページをロードすると、新しいトークンが生成されます。最後に、最初のページに戻り、フォーマット アクションを送信します。これにより、無効な CSRF トークン エラーが発生します。

可能な限り安全に保ちながら、複数のタブとの衝突を防ぐためにこれを再構築する最良の方法は何ですか?

ページの読み込みごとに新しいトークンを生成するのではなく、ログイン時に単一のトークンを生成するだけで正しい解決策ですか?

4

3 に答える 3

2

ログイン時に単一のトークンを使用できます。@ Josh3736 が指摘しているように、これは問題なく機能します。

ページごとに 1 つのトークンが必要な場合は、有効なトークンの配列を $_SESSION に格納できます。その後、個々のトークンが使用されるたびに失効します。オプションで、タイムアウト期間後にそれらを期限切れにすることもできますが、タイムアウトがセッションタイムアウトよりも短い場合にのみ意味があります。しかし、繰り返しになりますが、これで実際に何を達成しているのですか? CSRF の目的には、単一のトークンで十分です。

于 2013-11-18T20:31:57.930 に答える