CSRF対策についてです。
一般的にWebアプリケーションにはCSRF対策がされるかと思います。
いろいろ調べた結果、
①ユーザーのログイン時にクッキーにハッシュ値(トークン)を登録する
②hiddenフィールドもしくはリクエストヘッダーにXSRF-TOKENにクッキーのトークン値を設定し、リクエスト(Post)
③サーバー側では、クッキーの値とリクエストのトークン値が一致することを確認する
【質問】
このような流れになるのかと思いますが、
1、ユーザーの新規作成時(つまりログイン前)はクッキーにトークン値がないので、この場合は一般的にどのような実装になっているのでしょうか?
2、②でのhiddenもしくは、リクエストヘッダーのどちらにトークンを付与するのが一般的ですか?また理由も教えていただけると助かります。
また認識間違いがありましたら、教えていただけますと助かります。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
1、ユーザーの新規作成時(つまりログイン前)はクッキーにトークン値がないので、この場合は一般的にどのような実装になっているのでしょうか?
ログイン前では必ずしもCSRF対策をする必要はありませんが、したいのであれば、入力フォームでトークンを発行してクッキーとHidden等にセットすれば対応可能です。
2、②でのhiddenもしくは、リクエストヘッダーのどちらにトークンを付与するのが一般的ですか?また理由も教えていただけると助かります。
「一般的」というのは難しい質問ですが、古典的なウェブアプリではhiddenを使いました。その理由は、JavaScriptなしに実装できるからです。安全性という点ではリクエストヘッダの方が安全で、その理由は、リクエストヘッダの方が攻撃が難しくなるからです。その「難しくなる理由」は下記の本のP416に書いてあります(一部を引用)。
この問題の緩和のためにも、トークンパラメータの送信にHTTPリクエストヘッダを用いることをお勧めします。クロスオリジン通信でカスタムリクエストヘッダを付与するためには、プリフライトリクエストで許可される必要があるため、API側のプリフライトリクエストの処理にバグがなければ、CSRF攻撃は成立しません。
体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践
恐らくここを読んだだけでは理解できないと思います。なので、CSRF対策は自分で作ろうとせず、アプリケーションフレームワーク(Ruby on RailsやLaravel、.NET等)の機能を素直に使うことをお勧めします。
投稿2021/06/08 08:30
総合スコア11705
0
ベストアンサー
ASP.NET MVC の場合も質問者さんが書かれた機能がフレームワークに組み込まれていて、質問 1, 2 はどうなっているかと言うと、
1、ユーザーの新規作成時(つまりログイン前)はクッキーにトークン値がないので、この場合は一般的にどのような実装になっているのでしょうか?
トークンはランダムに生成されます。なので、ログインしているか否かに関係なくトークンは発行されます。
2、②でのhiddenもしくは、リクエストヘッダーのどちらにトークンを付与するのが一般的ですか?また理由も教えていただけると助かります。
hidden です。
理由は、それを書いてある Mictosoft のドキュメントは見つけられなかったので不明ですが、普通に考えてサーバーがランダムに生成したトークンをリクエストヘッダに含めるのは無理があるからだと思います。
ただし、フォームデータを POST するのではなく、例えば、AJAX で JSON 文字列を POST するような場合は (hidden は送れない場合は)、リクエストヘッダを使う方法も用意されているそうです。詳しくは以下の記事を見てください。
【追記】
下の 2021/06/09 15:19 の私のコメントで「ご参考に、あとで、ログイン有り無しの時のクッキーがどうなっているか Fiddler で見た画像を回答欄に貼っておきます」と書いた件です。
編集画面で編集したあと結果を POST した場面です。__RequestVerificationToken が CSRF 対策トークンのクッキー、.AspNet.ApplicationCookie は認証クッキーです。
ログイン無し
ログインしてなくとも CSRF 対策トークンのクッキーは編集画面が表示された際に受け取っていますので、POST すると送信されます。
ログイン有り
CSRF 対策トークンのクッキーは上と同じものです(ブラウザを閉じない限り同じクッキーが送信されます)。ログインした際に認証クッキーを受け取っていますので、POST 操作で両方送信されています。
hidden のトークン
ちなみに、hidden 要素のトークンは以下の画像の通りです。クッキーの CSRF 対策トークンと異なるのは追加情報が含まれているからです。
投稿2021/06/07 22:47
編集2021/06/09 06:45退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/08 03:18
退会済みユーザー
2021/06/08 04:55 編集
2021/06/08 11:13
退会済みユーザー
2021/06/08 12:08
2021/06/09 03:06
退会済みユーザー
2021/06/09 08:00 編集
退会済みユーザー
2021/06/09 06:19
2021/06/09 11:25 編集
0
こちらが良くまとまってます。
これで完璧!今さら振り返る CSRF 対策と同一オリジンポリシーの基礎
投稿2021/06/08 00:12
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/08 03:12
退会済みユーザー
2021/06/08 08:57
2021/06/08 11:03
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2021/06/08 08:55
退会済みユーザー
2021/06/08 08:59
2021/06/08 11:05