最近、ソリューションを MVC 2 に更新しました。これにより、AntiForgeryToken動作が更新されました。残念ながら、これはもはや AJAX フレームワークには適合しません。
Name問題は、MVC 2 が対称暗号化を使用して、ユーザーのプロパティ (から)を含む、ユーザーに関する一部のプロパティをエンコードすることIPrincipalです。AJAX を使用して新しいユーザーを安全に登録できます。その後、ユーザーに新しいプリンシパルが付与されると偽造防止トークンが変更されるため、その後の AJAX 呼び出しは無効になります。ユーザーが自分の名前を更新するなど、これが発生する可能性がある他のケースもあります。
私の主な質問は、なぜ MVC 2 がわざわざ対称暗号化を使用するのかということです。では、プリンシパルのユーザー名プロパティを気にするのはなぜでしょうか?
私の理解が正しければ、ランダムな共有シークレットで十分です。基本的な原則は、特定のデータ (HttpOnly!) を含む Cookie がユーザーに送信されることです。この Cookie は、副作用 (通常は POST) を持つ可能性のある各要求で返されるフォーム変数と一致するために必要です。これはクロスサイト攻撃から保護することのみを目的としているため、テストに簡単に合格する応答を簡単に作成できますが、それは Cookie に完全にアクセスできる場合に限られます。クロスサイト攻撃者はユーザー Cookie にアクセスできないため、保護されます。
対称暗号化を使用することで、Cookie の内容を確認する利点は何ですか? つまり、既に HttpOnly Cookie を送信している場合、攻撃者は (ブラウザに重大なセキュリティ上の問題がない限り) それを上書きすることはできません。
考えてみると、これは「追加されたセキュリティ層」のケースの 1 つであるように見えますが、防御の第 1 ラインが落ちた場合 (HttpOnly)、攻撃者は完全なアクセス権を持っているため、とにかく第 2 層を通り抜けようとしています。間接的な XSS/CSRF 攻撃を使用する代わりに、ユーザーの Cookie コレクションに直接なりすますことができます。
もちろん、大きな問題を見落としている可能性もありますが、まだ見つかっていません。ここで明らかな問題または微妙な問題が発生している場合は、それらに注意したいと思います。