CSRF攻撃とは?初心者向けに仕組みと対策を徹底解説【JavaScriptサンプル付き】

投稿日:
更新日:

CSRF攻撃とは何か?

CSRF(Cross-Site Request Forgery、クロスサイトリクエストフォージェリ)攻撃は、Webアプリケーションの脆弱性を悪用した攻撃手法の一つです。攻撃者は、ユーザーが認証済みのWebサイトに対して、ユーザーの意図しないリクエストを強制的に送信させます。

CSRF攻撃の仕組み

  1. ユーザーがWebサイトAにログインします。
  2. 攻撃者が用意した悪意のあるWebサイトBにアクセスします。
  3. WebサイトBには、WebサイトAに対するリクエストを送信するコードが埋め込まれています。
  4. ユーザーがWebサイトBにアクセスすると、WebサイトAに対するリクエストが自動的に送信されます。
  5. WebサイトAは、ユーザーがログイン済みであるため、リクエストを正当なものとして処理してしまいます。

なぜCSRF攻撃は危険なのか?

CSRF攻撃が成功すると、攻撃者はユーザーのアカウントを乗っ取ったり、ユーザーの情報を改ざんしたり、ユーザーになりすまして不正な操作を実行したりすることができます。例えば、以下のような被害が考えられます。

  • パスワードの変更
  • メールアドレスの変更
  • ECサイトでの不正購入
  • SNSでのなりすまし投稿

CSRF攻撃の具体的な例

CSRF攻撃の具体的な例を見てみましょう。

パスワード変更の例

ユーザーがWebサイトAにログインしており、パスワード変更のURLがhttps://example.com/change_password?password=new_passwordだとします。攻撃者は、以下のようなHTMLコードをWebサイトBに埋め込みます。

<img src="https://example.com/change_password?password=attacker_password" width="0" height="0">

ユーザーがWebサイトBにアクセスすると、WebサイトAに対してパスワード変更のリクエストが送信され、ユーザーのパスワードが攻撃者の設定したパスワードに変更されてしまいます。

メールアドレス変更の例

メールアドレス変更のURLがhttps://example.com/change_email?email=attacker@example.comの場合も同様に、攻撃者はHTMLコードを埋め込むことで、ユーザーのメールアドレスを攻撃者のメールアドレスに変更することができます。

ECサイトでの不正購入の例

ECサイトで商品を購入するURLがhttps://example.com/buy?item_id=123&quantity=1の場合、攻撃者はHTMLコードを埋め込むことで、ユーザーのアカウントで商品を不正に購入することができます。

CSRF攻撃の対策方法

CSRF攻撃を防ぐためには、以下の対策方法が有効です。

  • CSRFトークン(ワンタイムトークン)
  • SameSite Cookie属性
  • Refererヘッダーの検証

CSRFトークン(ワンタイムトークン)

CSRFトークン(ワンタイムトークン)は、リクエストごとに生成される予測不可能な文字列です。Webアプリケーションは、フォームやAPIリクエストにCSRFトークンを含め、サーバーサイドでトークンを検証することで、CSRF攻撃を防ぐことができます。

CSRFトークンの仕組みと役割

  1. サーバーは、ユーザーのセッションごとに一意のCSRFトークンを生成します。
  2. CSRFトークンは、フォームのhiddenフィールドやAPIリクエストのヘッダーに埋め込まれます。
  3. サーバーは、リクエストを受信するたびに、CSRFトークンを検証します。
  4. CSRFトークンが一致しない場合、リクエストは拒否されます。

CSRFトークンの実装方法(JavaScriptサンプルコード)

// CSRFトークンを生成する関数
function generateCSRFToken() {
  const randomBytes = new Uint8Array(32);
  window.crypto.getRandomValues(randomBytes);
  const token = Array.from(randomBytes, byte => byte.toString(16).padStart(2, '0')).join('');
  return token;
}

// CSRFトークンをhiddenフィールドに設定する
const csrfToken = generateCSRFToken();
const csrfInput = document.createElement('input');
csrfInput.type = 'hidden';
csrfInput.name = 'csrf_token';
csrfInput.value = csrfToken;
document.querySelector('form').appendChild(csrfInput);

// APIリクエストにCSRFトークンを設定する
fetch('/api/data', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-CSRF-Token': csrfToken // カスタムヘッダーに設定
  },
  body: JSON.stringify({ data: 'example' })
});

サーバーサイドでのCSRFトークンの検証

サーバーサイドでは、リクエストに含まれるCSRFトークンとセッションに保存されているCSRFトークンを比較し、一致するかどうかを検証します。

SameSite Cookie属性

SameSite Cookie属性は、Cookieがクロスサイトリクエストで送信されるかどうかを制御する属性です。SameSite=StrictまたはSameSite=Laxを設定することで、CSRF攻撃のリスクを軽減することができます。

  • SameSite=Strict: 完全にクロスサイトリクエストでのCookieの送信を禁止します。
  • SameSite=Lax: GETリクエストなど、一部のクロスサイトリクエストでのCookieの送信を許可します。

SameSite Cookie属性の設定方法

Set-Cookie: session_id=12345; SameSite=Strict; Secure; HttpOnly

SameSite Cookie属性の注意点

SameSite Cookie属性は、古いブラウザではサポートされていない場合があります。また、SameSite=Strictを設定すると、クロスサイトでのリンクやリダイレクトが正常に機能しなくなる可能性があります。

Refererヘッダーの検証

Refererヘッダーは、リクエストがどのWebサイトから送信されたかを示すヘッダーです。サーバーは、Refererヘッダーを検証することで、リクエストが正当なWebサイトから送信されたかどうかを確認することができます。

Refererヘッダーの検証方法

サーバーサイドで、Refererヘッダーの値が許可されたWebサイトのドメインと一致するかどうかを検証します。

Refererヘッダーの注意点

Refererヘッダーは、ブラウザやプロキシサーバーによって送信されない場合や、改ざんされる可能性があります。そのため、Refererヘッダーの検証は、CSRF攻撃対策の補助的な手段として利用するのが適切です。

CSRF攻撃対策のベストプラクティス

CSRF攻撃対策を行う際には、以下の点に注意しましょう。

  • 複数の対策を組み合わせる:CSRFトークン、SameSite Cookie属性、Refererヘッダーの検証など、複数の対策を組み合わせることで、より強固なセキュリティを確保できます。
  • 定期的なセキュリティレビューの実施:Webアプリケーションの脆弱性を定期的にチェックし、CSRF攻撃のリスクを評価することが重要です。
  • フレームワークやライブラリの利用:多くのWebアプリケーションフレームワークやライブラリには、CSRF攻撃対策の機能が組み込まれています。これらの機能を活用することで、効率的にCSRF攻撃対策を行うことができます。

CSRF攻撃と類似の攻撃手法

CSRF攻撃と類似の攻撃手法として、XSS(クロスサイトスクリプティング)攻撃やクリックジャッキング攻撃があります。

  • XSS攻撃:Webサイトに悪意のあるスクリプトを埋め込み、ユーザーのブラウザ上で実行させる攻撃です。
  • クリックジャッキング攻撃:透明なiframeを重ねて表示し、ユーザーに意図しない操作をさせる攻撃です。

これらの攻撃手法も、Webアプリケーションのセキュリティを脅かすため、適切な対策が必要です。

まとめ

この記事では、CSRF攻撃の仕組みと対策方法について解説しました。

  • CSRF攻撃は、ユーザーの意図しないリクエストを強制的に送信させる攻撃です。
  • CSRF攻撃を防ぐためには、CSRFトークン、SameSite Cookie属性、Refererヘッダーの検証などの対策が有効です。
  • 複数の対策を組み合わせ、定期的なセキュリティレビューを実施することが重要です。

次のステップ

  • WebアプリケーションフレームワークのCSRF対策機能を調べてみましょう。
  • OWASP(Open Web Application Security Project)のCSRF対策に関する情報を参考にしましょう。
  • セキュリティに関する勉強会やイベントに参加してみましょう。

安全なWebアプリケーション開発を目指して、一歩ずつ学習を進めていきましょう。