私が構築しているページは、AJAX に大きく依存しています。基本的に、「ページ」は 1 つだけで、すべてのデータ転送は AJAX を介して処理されます。ブラウザー側で過度に楽観的なキャッシングを行うと奇妙な問題 (データがリロードされない) が発生するため、POST を使用してすべての要求 (読み取りも) を実行する必要があります。これにより、リロードが強制されます。
ここで、CSRF に対してページを防止したいと考えています。フォームHtml.AntiForgeryToken()
送信ではうまく機能しますが、AJAX リクエストでは、トークンを手動で追加する必要があると思いますか? すぐに使用できるものはありますか?
私の現在の試みは次のようになります:
既存の魔法を再利用したい。ただし、HtmlHelper.GetAntiForgeryTokenAndSetCookie
プライベートであり、MVC をハックしたくありません。他のオプションは、次のような拡張機能を作成することです
public static string PlainAntiForgeryToken(this HtmlHelper helper)
{
// extract the actual field value from the hidden input
return helper.AntiForgeryToken().DoSomeHackyStringActions();
}
これはいくぶんハックであり、より大きな問題を未解決のままにします:そのトークンを確認する方法は? デフォルトの検証の実装は内部であり、フォーム フィールドの使用に対してハードコードされています。少し変更した を書こうとしましたValidateAntiForgeryTokenAttribute
が、AntiForgeryDataSerializer
それは非公開の を使用しており、それもコピーしたくありませんでした。
現時点では、自家製のソリューションを考え出す方が簡単に思えますが、それは実際には重複したコードです。
これをスマートな方法で行う方法について何か提案はありますか? 完全に明らかな何かが欠けていますか?