CSRF

セキュリティ | IT用語集

この用語をシェア

CSRFとは

CSRF(Cross-Site Request Forgery、クロスサイトリクエストフォージェリ)とは、ユーザーが信頼するWebサイトに対して、ユーザーの意図しない不正なHTTPリクエストを送信させるWebアプリケーション脆弱性の一種です。攻撃者は、ユーザーがログイン状態にあるWebサイトに対して、悪意のあるリクエストを実行させることで、パスワード変更、データ削除、不正送金などの操作を行わせます。

CSRF攻撃の仕組み

1. 攻撃のシナリオ

ユーザーが銀行サイトにログインした状態で、攻撃者が用意した悪意のあるWebサイトを訪問すると、そのサイトから銀行サイトへの送金リクエストが自動的に送信される、といった攻撃が典型例です。

⚠️ 攻撃例:悪意のあるHTMLフォーム

<!-- 攻撃者のサイトに埋め込まれた悪意のフォーム -->
<form action="https://bank.example.com/transfer" method="POST">
  <input type="hidden" name="to" value="attacker-account" />
  <input type="hidden" name="amount" value="10000" />
</form>
<script>
  document.forms[0].submit(); // 自動送信
</script>

2. 攻撃が成功する条件

  • ユーザーが対象サイトにログイン状態である
  • 対象サイトがCSRF対策を実装していない
  • 攻撃者が対象サイトのリクエスト形式を知っている
  • ユーザーが攻撃者の用意したサイトや悪意のあるメールを閲覧する

CSRF対策手法

1. CSRFトークン

最も一般的で効果的な対策です。各フォームにランダムなトークンを含め、サーバー側でトークンの妥当性を検証します。

<!-- HTML側:CSRFトークンをフォームに埋め込み -->
<form action="/transfer" method="POST">
  <input type="hidden" name="csrf_token" value="{{ csrf_token }}" />
  <input type="text" name="amount" />
  <button type="submit">送金</button>
</form>

// サーバー側(Node.js例):トークン検証
app.post('/transfer', (req, res) => {
  if (req.body.csrf_token !== req.session.csrf_token) {
    return res.status(403).send('CSRF token invalid');
  }
  // 正常な処理を継続
});

2. SameSite Cookie属性

Cookieの送信をファーストパーティコンテキストに制限することで、クロスサイトからのリクエストでセッションCookieが送信されることを防ぎます。

// SameSite属性の設定例
res.cookie('session', sessionId, {
  sameSite: 'strict', // または 'lax'
  secure: true,       // HTTPS必須
  httpOnly: true      // XSS対策
});

// Express.js session設定例
app.use(session({
  cookie: {
    sameSite: 'strict',
    secure: true,
    httpOnly: true
  }
}));

3. Origin/Refererヘッダー検証

リクエストの送信元を検証することで、信頼できるドメインからのリクエストかを確認します。

// Origin ヘッダー検証例
app.use((req, res, next) => {
  const origin = req.get('Origin');
  const referer = req.get('Referer');
  
  if (req.method === 'POST') {
    if (!origin && !referer) {
      return res.status(403).send('Missing origin header');
    }
    
    const allowedOrigins = ['https://example.com'];
    if (!allowedOrigins.includes(origin)) {
      return res.status(403).send('Invalid origin');
    }
  }
  
  next();
});

フレームワーク別の実装

フレームワーク CSRF対策 実装方法
Django デフォルト有効 {% csrf_token %}テンプレートタグ
Ruby on Rails デフォルト有効 protect_from_forgeryメソッド
ASP.NET Core AntiForgeryToken @Html.AntiForgeryToken()
Spring Security デフォルト有効 CsrfConfigurer設定

現代的な対策の組み合わせ

🔒 推奨されるCSRF対策の組み合わせ

  • CSRFトークン: すべての状態変更操作に必須
  • SameSite=Strict Cookie: セッションCookieのクロスサイト送信を防止
  • Origin検証: 追加的な検証レイヤー
  • Double Submit Cookie: ステートレスなトークン検証

セキュリティテスト

CSRF脆弱性の検出には、以下のツールやアプローチが有効です:

# OWASP ZAP でのCSRF脆弱性テスト
# 自動スキャンでCSRF脆弱性を検出

# Burp Suite での手動テスト
# 1. 正常なリクエストをキャプチャ
# 2. CSRFトークンを削除または無効な値に変更
# 3. リクエストを再送信してレスポンスを確認

# curl での簡易テスト例
curl -X POST https://example.com/transfer \
  -d "to=attacker&amount=1000" \
  -H "Cookie: session=victim_session" \
  --referer "https://malicious.com"

関連技術

XSS

クロスサイトスクリプティング攻撃

CORS

クロスオリジンリソース共有

CSP

コンテンツセキュリティポリシー

この用語についてもっと詳しく

CSRFに関するご質問や、セキュリティ対策のご相談など、お気軽にお問い合わせください。