Description
概要
「セキュリティ編」内に「CSRF(クロスサイトリクエストフォージェリ)」を作成する。
詳細 / 機能詳細
追加するファイルおよびフォルダーの構造は以下のとおり。
documents
└ contents
└ app-architecture
├ client-side-rendering
├ console-app
├ overview
└ security
├ index.md
└ csrf.md ← この Issue で追加するファイル
csrf.md
の内容
CSRF 対策の基本方針は以下とする。
GET/HEAD 以外の全リクエストで Origin ヘッダーの値が許可しているオリジンと一致することを確認し、一致しなければ 403 Forbidden を返す。
クロスオリジンでもセイムオリジンでも同じ処理を行う。これは、セイムオリジンでも GET または HEAD 以外のリクエストでは Origin が設定されるため(出典: Origin - HTTP | MDN )。
大まかに言うと、ユーザーエージェントが Origin リクエストヘッダーを追加するのは以下のものです。
- オリジン間リクエスト
- 同一オリジンリクエスト、ただし GET または HEAD リクエストを除く(すなわち、同一オリジンの POST, OPTIONS, PUT, PATCH, DELETE の各リクエストに追加される。)
ただし、このCSRF対策は「 GET はリソースを取得するためのメソッドであり、更新系処理はありえない」という REST API の前提に立っている。
また、セイムオリジンの場合、 Origin ヘッダーではなく Sec-Fetch-Site ヘッダーをチェックすることで、より簡単に CSRF 対策が可能であることをドキュメントに追記する( 今時の CSRF 対策ってなにをすればいいの? | Basicinc Enjoy Hacking! )。
※クロスオリジンで Sec-Fetch-Site ヘッダーがどのような動作をするのか要検証。たとえばクロスオリジンでも許可したオリジンからのリクエストの場合に「same-site」が設定されるようであれば、Origin の代わりにこちらを使うことも考えられる。
決まった方針とサンプルの実装が異なる場合、サンプルを修正する。なお、オリジンの検証は使用している OSS がすでに実施している可能性がある(特にクロスオリジンを設定している API 周り)。調査し、実施していなければ必要に応じて共通部品を追加する。
方針を決めるにあたり参考にしたサイト:
- Web API の CSRF 対策まとめ【追記あり】 #JavaScript - Qiita
- ASP.NET Core でクロスオリジン要求 (CORS) を有効にする | Microsoft Learn
- CookieのSameSite属性で「防げるCSRF」と「防げないCSRF」 - まったり技術ブログ
また、ドキュメントを作成するにあたり動作検証を実施すること。実際に別オリジンのJavaScriptからAPIにリクエストを送信し、403エラーとなることを確認する。
関連 Issue : #398
完了条件
- ドキュメントの「セキュリティ編」内に「CSRF (クロスサイトリクエストフォージェリ)」が追加されていること
- 追加したドキュメントにリンクが張られていること
- サンプルのコードが作成したドキュメントの内容のとおりであること
- 実際に別オリジンのサイトからリクエストを送信した場合にエラーが返ること