クロスサイトリクエストフォージェリ(CSRF)とは?

0

2025年02月24日 9:22

クロスサイトリクエストフォージェリ(CSRF)とは?

1. はじめに

「気づいたら勝手に送金されていた…」「アカウントが乗っ取られた!」

こんな怖い話、聞いたことありませんか?
それ、もしかすると クロスサイトリクエストフォージェリ(CSRF) が原因かもしれません。

CSRFは、攻撃者がユーザーの認証済みセッションを悪用し、意図しないリクエストを送信させる攻撃のことです。
今回は Node.js を使った具体例を交えて、CSRFの仕組みと対策をわかりやすく解説します。


2. CSRFの仕組み

CSRFの基本的な流れは以下のようになります。

  1. ユーザーが正規サイトにログイン

    • 例えば、ある銀行のウェブサイトにログインしている。
  2. 攻撃者が悪意のあるページを作成

    • 「特別割引キャンペーン!」と見せかけたサイトを作成。
  3. ユーザーが攻撃者のページにアクセス

    • そのページには、ユーザーの銀行口座から送金させるコードが埋め込まれている。
  4. ユーザーのセッションを利用して、意図しないリクエストが送信される

    • ユーザーがそのページを開いた瞬間、ユーザーの意図とは無関係に送金処理が実行される。

例えば、攻撃者のページが以下のようなコードを含んでいた場合、ユーザーは気づかないうちに自分の銀行口座からお金を送金してしまいます。

img

このリクエストは すでにログイン済みのセッションを利用して 実行されるため、送金が完了してしまうのです。


3. Node.jsアプリケーションにおけるCSRFの脆弱性

Node.jsでExpressを使用した簡単なWebアプリを考えてみましょう。

以下のように、ユーザーが送金するためのエンドポイントがあったとします。

img

このエンドポイントにはCSRFの脆弱性があります。攻撃者がユーザーの知らぬ間に以下のようなHTMLを使って自動送金させることができます。

img

このHTMLを攻撃者のWebサイトに埋め込んでおくことで、
ユーザーがサイトを訪問した瞬間に勝手に送金が実行される のです。


4. CSRFの対策

では、どのようにしてCSRF攻撃を防げばよいのでしょうか?

4.1 CSRFトークンの導入

最も一般的な対策は CSRFトークン(CSRF Token) を使用することです。

このトークンは、フォーム送信時にサーバー側で検証されるため、攻撃者が勝手にリクエストを送ることができなくなります。

実装例(Express + csurf)

img

このようにすると、

  1. サーバーがCSRFトークンを生成
  2. フォームにCSRFトークンを埋め込む
  3. 送信されたトークンを検証

という流れでCSRF攻撃を防ぐことができます。

4.2 SameSite属性の設定

最近のブラウザでは、SameSite属性 を適切に設定することでCSRFを軽減できます。

img

これにより、異なるサイトからのリクエストでセッションが送信されなくなり、CSRF攻撃を防げます。


5. まとめ

  • CSRFは、ユーザーのセッションを悪用して不正なリクエストを送信させる攻撃。
  • Node.jsでの脆弱な実装では、POSTリクエストを勝手に実行される可能性がある。
  • CSRFトークンを導入することで、攻撃を防ぐことができる。
  • SameSite属性を設定することで、追加の保護が可能。

CSRFは一見すると地味な攻撃ですが、実際に被害を受けると甚大な損害を被る可能性があります。

しっかりとした対策を行い、安全なWebアプリケーションを構築しましょう!

[cv:issue_marketplace]

# セキュリティ
0

診断を受けるとあなたの現在の業務委託単価を算出します。今後副業やフリーランスで単価を交渉する際の参考になります。また次の単価レンジに到達するためのヒントも確認できます。