CSRF対策についてです。
一般的にWebアプリケーションにはCSRF対策がされるかと思います。
いろいろ調べた結果、
①ユーザーのログイン時にクッキーにハッシュ値(トークン)を登録する
②hiddenフィールドもしくはリクエストヘッダーにXSRF-TOKENにクッキーのトークン値を設定し、リクエスト(Post)
③サーバー側では、クッキーの値とリクエストのトークン値が一致することを確認する
【質問】
このような流れになるのかと思いますが、
1、ユーザーの新規作成時(つまりログイン前)はクッキーにトークン値がないので、この場合は一般的にどのような実装になっているのでしょうか?
2、②でのhiddenもしくは、リクエストヘッダーのどちらにトークンを付与するのが一般的ですか?また理由も教えていただけると助かります。
また認識間違いがありましたら、教えていただけますと助かります。
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
下記のような質問は推奨されていません。
- 質問になっていない投稿
- スパムや攻撃的な表現を用いた投稿
適切な質問に修正を依頼しましょう。
回答3件
2
1、ユーザーの新規作成時(つまりログイン前)はクッキーにトークン値がないので、この場合は一般的にどのような実装になっているのでしょうか?
ログイン前では必ずしもCSRF対策をする必要はありませんが、したいのであれば、入力フォームでトークンを発行してクッキーとHidden等にセットすれば対応可能です。
2、②でのhiddenもしくは、リクエストヘッダーのどちらにトークンを付与するのが一般的ですか?また理由も教えていただけると助かります。
「一般的」というのは難しい質問ですが、古典的なウェブアプリではhiddenを使いました。その理由は、JavaScriptなしに実装できるからです。安全性という点ではリクエストヘッダの方が安全で、その理由は、リクエストヘッダの方が攻撃が難しくなるからです。その「難しくなる理由」は下記の本のP416に書いてあります(一部を引用)。
この問題の緩和のためにも、トークンパラメータの送信にHTTPリクエストヘッダを用いることをお勧めします。クロスオリジン通信でカスタムリクエストヘッダを付与するためには、プリフライトリクエストで許可される必要があるため、API側のプリフライトリクエストの処理にバグがなければ、CSRF攻撃は成立しません。
体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践
恐らくここを読んだだけでは理解できないと思います。なので、CSRF対策は自分で作ろうとせず、アプリケーションフレームワーク(Ruby on RailsやLaravel、.NET等)の機能を素直に使うことをお勧めします。
投稿2021/06/08 08:30
総合スコア11655
1
ベストアンサー
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総合スコア17941
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
回答へのコメント
0
こちらが良くまとまってます。
これで完璧!今さら振り返る CSRF 対策と同一オリジンポリシーの基礎
投稿2021/06/08 00:12

退会済みユーザー
総合スコア0
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
回答へのコメント

退会済みユーザー
2021/06/08 08:57
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
関連した質問
Q&A
受付中
AWS Cognitoでユーザーがログインしてから60日後の最初のログインで確認コードのメールを送る機能
回答1
クリップ0
更新
2023/04/29
Q&A
解決済
ハンバーガーボタンを動くようにしたい
回答1
クリップ0
更新
2023/06/06
意見交換
受付中
Ubuntu23.04LTSに対するssh接続とリモートデスクトップ接続の正解を知りたい
回答3
クリップ0
更新
2023/05/24
Q&A
解決済
別のサーバーへフォーム送信時のcsrf対策について
回答3
クリップ0
更新
2023/05/03
Q&A
受付中
githubにpushするとエラーになる原因の特定方法を教えてほしいです
回答2
クリップ0
更新
2023/05/31
Q&A
解決済
VBAでウェブサイトのテーブルの1要素をクリックする方法をご教示ください。
回答1
クリップ0
更新
2023/06/06
Q&A
解決済
CakePHPのシステムを切り戻したがパーミッションエラーが発生している
回答1
クリップ0
更新
2023/05/30
Q&A
解決済
Ajaxでフォームの内容をPHPに渡してPDFを作成し文字列を引き渡し、受け取った文字列をjavascriptでPDF化したい
回答2
クリップ0
更新
2023/06/02
同じタグがついた質問を見る
クロスサイトリクエストフォージェリ (Cross site request forgeries、CSRF)は、 外部Webページから、HTTPリクエストによって、 Webサイトの機能の一部が実行されてしまうWWWにおける攻撃手法です。
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
退会済みユーザー
2021/06/08 08:55
退会済みユーザー
2021/06/08 08:59
2021/06/08 11:05