クロスサイトリクエストフォージェリ(CSRF)
CSRF攻撃が認証済みリクエストを偽造する仕組みと、CSRFトークンおよびSameSite Cookieによる防御方法を学びます。
「クロスサイトリクエストフォージェリ(CSRF)」はCoddyKit上の無料Cyber Security Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCyber Security Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cyber Security Academyコースには全4レッスンが含まれています。
CSRFとは何ですか
クロスサイトリクエストフォージェリ(CSRF)は、認証済みユーザーのブラウザーをだまして、Webアプリケーションに対する未承認のリクエストを送信させます。ブラウザーはリクエストにCookieを自動的に付加するため、追加の対策がなければ、サーバーは正当なリクエストと偽造リクエストを区別できません。
CSRFの仕組み
シナリオ:
- 被害者がbank.comにログインしている(ブラウザーにセッションCookieがある)
- 被害者が、次の内容を含む攻撃者のページにアクセスする:
<img src="https://bank.com/transfer?to=attacker&amount=1000"> - ブラウザーがbank.comのCookieを付けてGETリクエストを送信する
- 銀行が送金を処理する
POSTリクエストに対するCSRF
POSTによるCSRFにはフォームが必要です:
<form action="https://bank.com/transfer" method="POST" id="f">
<input name="to" value="attacker">
<input name="amount" value="1000">
</form>
<script>document.getElementById("f").submit()</script>CSRFトークン
主な防御策はCSRFトークンです。フォームに埋め込む、セッションごと(またはリクエストごと)に生成されたランダムで秘密の値です。サーバーは、状態を変更するすべてのリクエストでトークンを検証します。別のドメイン上の攻撃者は、同一オリジンポリシーによってトークンを読み取れません。
SameSite Cookie属性
SameSite=Strict:クロスサイトリクエストではCookieを一切送信しません。SameSite=Lax:安全なトップレベルナビゲーション(リンク)ではCookieを送信しますが、他サイトからのPOSTでは送信しません。最新のブラウザーではデフォルトがLaxであり、CSRFのリスクを大幅に低減します。
Double Submit Cookieパターン
サーバー側でのトークン保存に代わる方法です。ランダムなCSRF Cookieを設定し、リクエストパラメータとしても送信するよう要求します。攻撃者はCookieを読み取れないため(同一オリジン)、フォームデータ内の値と一致させることができません。
カスタムリクエストヘッダー
AJAXリクエストでは、カスタムヘッダー(例:X-Requested-With: XMLHttpRequest)を必須にするとCSRF対策になります。ブラウザーは、クロスオリジンのスクリプトが任意のヘッダーを設定するのをブロックするためです(CORSによって強制されます)。
CSRFトークンだけでは不十分な場合
CSRFトークンは、次の場合に機能しません:
- XSSが存在する場合 — 攻撃者はJavaScriptでトークンを読み取れます
- トークンがURL(Refererヘッダー)に漏えいした場合
- トークンが予測可能または再利用されている場合
- 攻撃者のオリジンを許可するようCORSが誤設定されている場合
CSRFのテスト
テスト手順:
- 状態を変更するリクエスト(POST、PUT、DELETE)を特定する
- CSRFトークンを削除または変更して再送信する
- クロスオリジンのフォーム送信を作成し、成功するか確認する
- セッションCookieのSameSite属性を確認する
APIにおけるCSRF
JSONを使用するREST APIは、次の条件を満たす場合、CSRFの対象外になることが多いです:
Content-Type: application/jsonを要求する(HTMLフォームではこれを設定できません)- トークンベース認証を使用する(CookieではなくAuthorizationヘッダーを使用する)
ただし、Cookieを受け入れるAPIでは、CSRF対策を実装する必要があります。
現代のCSRF事情
Chrome、Firefox、SafariではSameSite=Laxがデフォルトになっているため、従来型のCSRF攻撃の多くがブロックされます。ただし、サブドメイン攻撃や特定のナビゲーションパターンでは、Laxを回避できる場合があります。堅牢な防御のため、SameSiteとCSRFトークンを組み合わせてください。
理解度チェック:CSRF
WebアプリケーションにおけるCSRF攻撃への主な防御策は何ですか?
レッスンのまとめ
CSRFは、ブラウザーがCookieを自動的に付加する仕組みを悪用し、悪意のあるサイトから認証済みリクエストを偽造します。主な防御策は、サーバー側で検証するCSRFトークンです。副次的な対策として、SameSite=Strict/Lax Cookie属性があります。Cookieではなくヘッダー内のトークン認証を使用するAPIは、自然にCSRF耐性を備えています。防御策を組み合わせてください。XSSが存在するとCSRFトークンを回避される可能性があります。
よくある質問
「クロスサイトリクエストフォージェリ(CSRF)」レッスンは無料ですか?
はい。「クロスサイトリクエストフォージェリ(CSRF)」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cyber Security Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cyber Security Academyコースには全4レッスンが含まれています。
「クロスサイトリクエストフォージェリ(CSRF)」で何を学びますか?
CSRF攻撃が認証済みリクエストを偽造する仕組みと、CSRFトークンおよびSameSite Cookieによる防御方法を学びます。 ブラウザで直接実行するハンズオンコードでCyber Security Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Cyber Security Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCyber Security Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「クロスサイトリクエストフォージェリ(CSRF)」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCyber Security Academyレッスンでコードを書いて実行できますか?
はい。すべてのCyber Security Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- SQLインジェクション:仕組みと発生理由
- クロスサイトスクリプティング(XSS)
- クロスサイトリクエストフォージェリ(CSRF)
- セキュリティ設定ミスと公開サービス