web-dev-qa-db-ja.com

CSRF保護:すべてのフォームに対してトークンを生成する必要がありますか?

Webサイトのすべてのフォームに対して、トークンを生成する必要がありますか?つまり、要求されたフォームごとに異なるトークンを生成するたびに?そうでない場合、なぜですか?

30
Centurion

一般に、 セッションごとに1つのトークン 、いわゆるセッションごとのトークンがあれば十分です。

通常、開発者は現在のセッションでこのトークンを1回だけ生成する必要があります。このトークンの最初の生成後、値はセッションに格納され、セッションが期限切れになるまで後続の各要求に使用されます。

セキュリティをさらに強化したい場合は、フォーム/ URLごとに1つのトークン(フォームごとのトークン)を使用して、1つのトークンの影響を軽減できます。攻撃者はその特定のフォーム/ URLのみを正常に攻撃できるため、リーク(例: [〜#〜] xss [〜#〜] )。

ただし、リクエストごとのトークンを使用すると、i。 e。リクエストごとに変化するトークンは、並列ブラウジングを制限するため、Webサイトの使いやすさを低下させます。

この提案された設計のセキュリティをさらに強化するには、リクエストごとにCSRFトークン[…]をランダム化することを検討してください。このアプローチを実装すると、セッションごとのトークンではなく、リクエストごとのトークンが生成されます。ただし、これによりユーザビリティが懸念される場合があることに注意してください。たとえば、前のページに無効になったトークンが含まれている可能性があるため、「戻る」ボタンのブラウザ機能が妨げられることがよくあります。この前のページとの相互作用により、サーバーでCSRF誤検知セキュリティイベントが発生します。

したがって、セッションごとのトークンまたはフォームごとのトークンのいずれかを使用することをお勧めします。

33
Gumbo

いいえ、必要なのは セッションごとにトークンを生成する です。

トークンがユーザーによって誤って漏洩する可能性は非常に低く、ユーザーが2つの異なるタブ/ウィンドウで同時にサイトを閲覧している場合、フォームごとにトークンを生成すると非常に複雑になります。

11
Quentin