はじめに
Malcolm McDonald 著『Web Application Security, 2nd Edition』(O'Reilly)を通読しました。本書はWebアプリケーションのセキュリティを「偵察(Reconnaissance)」「攻撃(Offense)」「防御(Defense)」という3部構成で体系的に解説した一冊です。
初版と比べて100ページ以上の新規コンテンツが追加されており、GraphQL・NoSQLといったモダンな技術スタックへの対応も強化されています。また、初級〜中級エンジニア向けだった初版から、上級者も読み応えを感じられる構成へと進化しています。
本書の対象読者
前提知識として「中級レベルのソフトウェアエンジニアリング」を求めています。具体的には以下のスキルが目安です。
- 少なくとも1つの言語でCRUDアプリを書いたことがある
- フロントエンド・バックエンド両方のコードをHTTP越しに連携させた経験がある
- MySQLやMongoDBなど一般的なDBに触れたことがある
セキュリティの知識はゼロからでも大丈夫ですが、Web開発の基礎がない状態では読み進めるのが難しいでしょう。
構成の概要
本書は偵察・攻撃・防御がほぼ1:1:1になるよう意図的に設計されています。防御だけを知りたい場合はパートIIIから参照する使い方も可能ですが、著者は一読を強く推奨しています。その理由は後述します。
パートI:偵察(Reconnaissance)
コードの読み書きができなくても実施できる情報収集技術を扱います。サブドメインの探索・APIエンドポイントの発見・サードパーティ依存関係のフィンガープリンティングなどが主なトピックです。
著者が強調するのは「優秀なハッカーと凡庸なハッカーの差は偵察力にある」という点です。速い車(エクスプロイト技術)を持っていても、最短ルート(脆弱箇所の特定)を知らなければレースに勝てない、というアナロジーが印象的でした。
防御側の視点からも偵察スキルは有用です。攻撃者の目線でアプリをマッピングすることで、優先的に保護すべき領域が見えてきます。
パートII:攻撃(Offense)
架空のWebアプリ mega-bank.com を標的として、主要な攻撃手法を実際に手を動かしながら学びます。各章は「攻撃の仕組みを理解する → 脆弱箇所を探す → ペイロードを構築・展開する」という流れで統一されています。
扱われる攻撃手法は以下のとおりです。
XSS(クロスサイトスクリプティング)
DOMレベルのサニタイズが施されていても、DOMシンクを利用した高度なXSSが成立するケースを丁寧に解説しています。XSS-Sniperのような自動ツールは使わず、ペイロードを自前で組み立てることで、ツール依存の危うさを体で理解できます。
CSRF(クロスサイトリクエストフォージェリ)
ブラウザとユーザー間の信頼関係を悪用する攻撃です。状態変更をGETリクエストで行っている実装が特に狙われやすいことを、具体例で示しています。
XXE(XML外部エンティティ)
不適切に設定されたXMLパーサーが、サーバー上の機密ファイルを漏洩させるリスクを解説します。直接XMLを受け取らない「間接XXE」のパターンも扱っており、見落としがちな攻撃経路を把握できます。
インジェクション攻撃
SQLインジェクションにとどまらず、画像圧縮ツールやバックアップユーティリティなどCLIを経由したインジェクション攻撃まで範囲を広げています。「SQLは対策済みでも、その先がある」という視点は実務でも重要です。
DoS / DDoS
正規表現のバックトラッキングを悪用するReDoSから、ネットワークレベルのDDoSまでを網羅しています。
クライアント側攻撃
タブナビング・クリックジャッキング・プロトタイプポリューションといった攻撃は、サーバー側コードを一切操作せずブラウザ内だけで完結します。特定ブラウザへの依存性が高く、通常の開発フローでは検出しにくい点が特徴です。
ビジネスロジックの脆弱性
SAST・DAST・SCAといった自動化ツールでは発見が難しく、アプリ固有のビジネスルールを理解した人間が手動でテストするしかないという点が強調されています。
パートIII:防御(Defense)
パートIIで登場した攻撃手法を一つひとつ裏返し、防御策を構築します。本書の構成の肝は「攻撃を理解してから防御を学ぶ」順序にある、と読んで確信しました。防御章を先に読んでも形式知にとどまりますが、攻撃章を経た後だと「なぜこの防御が必要なのか」が体感として腑に落ちます。
アーキテクチャレベルの防御
セキュリティ対策はコード完成後に後付けするものではなく、アーキテクチャ段階に組み込むべきというのが著者の一貫した主張です。アーキテクチャ段階で発見した脆弱性の修正コストは、本番環境での発見に比べて60分の1以下になる可能性があると述べています。
セキュリティと利便性のトレードオフ
たとえばログインフォームのエラーメッセージを「メールアドレスが存在しません」と表示するか「認証情報が正しくありません」と表示するか、というトレードオフの話が具体的でわかりやすいです。セキュリティ強度とUXは常にトレードオフであることを、複数の実例を通じて説明しています。
セキュア開発ライフサイクル(SSDL)
脅威モデリング → セキュリティ重視のコードレビュー → 自動・手動の脆弱性発見 → CVSSスコアリングによる管理 という一連のフローが解説されています。
各攻撃手法への具体的な防御策
| 攻撃手法 | 主な防御策 |
|---|---|
| XSS | DOMサニタイズ・CSPヘッダー |
| CSRF | CSRFトークン・MFA確認・状態変更GETの排除 |
| XXE | 外部エンティティ無効化・XML類似フォーマットへの同様の考慮 |
| インジェクション | プリペアドステートメント・最小権限原則 |
| DoS | ReDoS検出・APIレート制限・DDoS向けブラックホールルーティング |
| クライアント側攻撃 | CSP・Object.freeze()・フレームバスタースクリプト |
| サードパーティ依存 | CVEデータベース確認・権限の最小化・統合前スキャン |
本書を読んで感じたこと
コードサンプルが主にJavaScriptで書かれているのは意図的な選択です。ブラウザ上で動作する唯一の言語であるJavaScriptをクライアント側の例に使うのは自明として、サーバー側も同じ言語で統一することで、フロント・バック両方のコードを一冊で完結させています。他言語への応用は読者に委ねられていますが、概念的な理解があれば問題ありません。
ツールに頼らず概念から入るスタイルは、「ツールが陳腐化しても概念は生き続ける」という哲学の表れです。実際、セキュリティツールのライフサイクルは短く、ツール操作を覚えるだけでは継続的なスキルアップが難しいという問題意識は、現場感覚と一致します。
ハッカーの思考様式についての記述も読み応えがありました。「ハッカーの生産性は定量化しにくい。データ収集と分析の大半は誤検知に満ちており、傍から見ると時間の無駄に見える」という描写は、セキュリティ業務の本質を正直に伝えています。
こんな方に特にお勧めです
- Webアプリの設計・実装経験はあるが、セキュリティをきちんと学んだことがない方
- 「なぜこの実装が危険なのか」を体感として理解したい方
- ペネトレーションテストやバグバウンティに興味がある方
- セキュリティエンジニアへのキャリアチェンジを検討している方
まとめ
本書の価値は「攻撃と防御を同じ本の中で1:1の比率で学べる」構造にあります。防御だけを学ぶと「なぜ必要か」が薄くなりがちで、攻撃だけを学ぶと倫理的・実務的な限界があります。本書はその両者を往復することで、セキュリティエンジニアリングの全体像を体得させる設計になっています。
第2版でGraphQL・NoSQL対応・上級向けコンテンツが大幅に追加されたことで、初版を読んだ方にも再読の価値があります。Webセキュリティの体系的な入門書として、手元に置いておきたい一冊です。