CSRFとは?初心者向けに仕組みと対策を解説

セキュリティ

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

CSRF(Cross-Site Request Forgery、クロスサイトリクエストフォージェリ)は、ユーザーが意図しないリクエストを攻撃者が実行させる攻撃手法です。
簡単に言えば、「他人になりすまして勝手に操作する」ような攻撃です。

CSRFの仕組み

正常な動作

まず、通常のリクエストがどのように動くのか見てみましょう。

例:銀行の振込操作
銀行のサイトで、ユーザーが送金フォームを使ってお金を送るとします。

  • ユーザーがログインした後、次のようなリクエストが送られます。
Plaintext
POST /transfer Amount=1000&ToAccount=123456
  • このリクエストは、銀行が提供する正しい機能を使っています。

攻撃者の介入

攻撃者は、ユーザーがログイン中であることを利用します。

  • 攻撃者が作った悪意のあるサイトにユーザーを誘導します。
    • たとえば、メールやSNSでリンクを送ります。
Plaintext
http://malicious-site.com/steal-money
  • 悪意のあるサイトに次のようなコードを埋め込みます。
    このコードは、ユーザーのブラウザから銀行にリクエストを送ります。
HTML
<img src="http://bank.com/transfer?Amount=1000&ToAccount=987654" /> 
  • ユーザーがリンクをクリックすると、自分の意図とは関係なくリクエストが送信されます。
    これにより、攻撃者の口座(ToAccount=987654)にお金が送られます。

CSRFの被害

CSRF攻撃に成功すると、以下のような被害が発生する可能性があります:

  1. 不正送金
    • ユーザーの銀行口座から攻撃者の口座にお金が送金される。
  2. アカウント乗っ取り
    • ユーザーのアカウント設定が攻撃者によって変更される。
  3. データの削除や改ざん
    • ユーザーのデータが消される、または内容が変更される。
  4. 商品購入の強制
    • ECサイトで、ユーザーのアカウントを使って商品が勝手に購入される。

CSRFを防ぐ方法

CSRFを防ぐためには、以下の対策を実施する必要があります。

CSRFトークンの利用

CSRFトークンは、ユーザーごとにユニークな値を生成し、フォームやリクエストに埋め込みます。サーバー側でトークンを確認することで、不正なリクエストをブロックできます。

例:HTMLフォームにCSRFトークンを追加

HTML
<form method="POST" action="/transfer">
  <input type="hidden" name="csrf_token" value="abc123">
  <input type="text" name="amount">
  <input type="text" name="to_account">
  <button type="submit">送信</button>
</form>

リファラーチェック

サーバーがリクエストの送信元を確認し、信頼できるドメインからのリクエストだけを受け入れる方法です。

CookieのSameSite属性を設定

SameSite属性を設定すると、クロスサイトのリクエストでCookieが送信されなくなります。

例:HTTPレスポンスヘッダー

Plaintext
Set-Cookie: sessionid=abc123; SameSite=Strict

GETリクエストで副作用のある処理を行わない

CSRF攻撃はGETリクエストでも実行可能です。そのため、データ変更や重要な操作はすべてPOSTリクエストに限定しましょう。

CSRFの具体例と防止策の比較

攻撃例

攻撃者が以下のリンクを仕掛けます

HTML
<img src="http://example.com/transfer?Amount=1000&ToAccount=987654" />

防止策の適用

  • CSRFトークンを導入すると、このリクエストには正しいトークンが含まれないため、サーバーは拒否します。
  • SameSite属性を設定している場合、このリクエストにユーザーのセッション情報が送られないため、不正操作は無効になります。

まとめ

CSRF攻撃は、ユーザーの意図に反して操作を行わせる非常に危険な攻撃です。しかし、CSRFトークンやリファラーチェック、SameSite属性の設定などの基本的なセキュリティ対策を行えば、防ぐことが可能です。

重要なのは、「リクエストの正当性を確認する」という原則を徹底することです。ユーザーの安全を守るため、必ずこれらの対策を実装しましょう!

コメント

タイトルとURLをコピーしました