CSRFから保護するために、ページのJavaScriptは、送信される直前に、セッションIDをCookieから各HTTPリクエストの本文に動的に挿入できませんでしたか?
その後、サーバーは(cookieから受け取った値)==(リクエスト本文からの値)...
OWASPのCSRF防止ページ から引用:
Cookieの二重送信
Cookieの二重送信とは、すべてのフォーム要求に対して2つの異なる方法でセッションID Cookieを送信することと定義されています。最初は従来のヘッダー値として、そして再び隠しフォーム値として。ユーザーがサイトにアクセスすると、サイトは(暗号的に強力な)疑似ランダム値を生成し、それをユーザーのマシン上のCookieとして設定する必要があります。これは通常、セッションIDと呼ばれます。サイトでは、すべてのフォーム送信で、この疑似ランダム値を非表示のフォーム値およびCookie値として含める必要があります。 POSTリクエストがサイトに送信された場合、フォームの値とCookieの値が同じである場合にのみ、リクエストは有効であると見なされます。攻撃者がユーザーに代わってフォームを送信すると、フォームの値のみを変更できます。攻撃者は、同じ元のポリシーに従って、サーバーから送信されたデータを読み取ったり、Cookieの値を変更したりすることはできません。つまり、攻撃者は任意の値をフォームで送信できますが、Cookieに格納されている値を変更したり読み取ったりすることはできません。 Cookieの値とフォームの値は同じである必要があるため、攻撃者はセッションIDの値を推測できない限り、フォームを正常に送信できません。
このアプローチはクロスサイトリクエストフォージェリのリスクを軽減するのに効果的ですが、認証済みのセッション識別子をHTTPパラメータに含めると、セッションハイジャックの全体的なリスクが高まる可能性があります。アーキテクトと開発者は、ネットワークアプライアンス、カスタムアプリケーションコード、モジュールが明示的にログに記録したり、HTTP POSTパラメータを開示したりしないようにする必要があります。 HTTP POSTパラメータをリークするリポジトリまたはチャネルへのアクセスを取得できる攻撃者は、トークンを再生し、セッションハイジャック攻撃を実行することができます。ただし、すべてのHTTP POSTパラメータを透過的にログに記録することは、ネットワークシステムおよびWebアプリケーション全体でまれに発生することに注意してください。これを行うと、パスワード、クレジットカード番号、または社会保障などのセッション識別子の他に、重要な機密データが公開されます。番号。 HTML内にセッション識別子を含めることは、クロスサイトスクリプティング攻撃によってHTTPOnly保護をバイパスするためにも利用できます。最新のブラウザのほとんどは、クライアント側のスクリプトがHTTPOnly Cookieにアクセスできないようにしています。ただし、クライアント側のスクリプトがDOMからIDを簡単に走査して抽出できるため、HTTPOnlyセッションIDがHTML内に配置されている場合、この保護は失われます。この記事で説明するように、開発者はシンクロナイザトークンパターンを実装することをお勧めします。
組み込みのCSRF防止メカニズムを使用するだけの真の理由はありません。ほとんどすべての深刻なフレームワークがこれを持っています。
いいえ、スクリプトによるCookieへのアクセスを許可しないでください。 OWASP Webサイトの HTTPOnly を参照してください。
人々がセッションIDを盗むことができないようにするには、XSSが存在する場合、常にこのCookieフラグを設定する必要があります。 Cookieにアクセスできないため、メカニズムは機能しなくなります。
あなたできましたですが、私には少し扱いにくいようです。 CSRF防止メカニズムは次のように機能します。
実証済みの方法は、何らかのCSRFトークンを含むHTMLフィールドで<input type=hidden>
を使用することです。あなたの方法もうまくいきます1ただし、JSを使用してインターセプトおよびインジェクトするPOSTリクエストは、クライアント側ロジック全体をHTMLに含めることができる場合、不自然で不必要に聞こえます。
1 TildalWaveが指摘したように、XSSの脆弱性がある場合、機密データをhttponly
以外のCookieに入れ、クライアント側のJSにアクセスできるようにすることは問題になる可能性があります。その後、実証済みの方法を使用します。
多くの人が述べたように-別のナンスを使用する場合、二重送信はOK CSRF保護です。セッションIDの使用は、このコンテキストでは非常に間違っています。XSS保護のためにセッションIDはHTTPOnlyでなければならないという事実から始まります。
「このページ/ウェブサイトにXSSがある場合はどうなるか」という議論は無効です。XSSを使用している場合、心配はCSRFが最も少ないことです。ブラウザーは、挿入されたスクリプトを介して完全にリモートで制御できるようになり、ユーザーに代わってブラウザーに強制的にアクションを実行させるためにCSRFは必要ありません。