WEB開発経験の少ない人が「徳丸本」を情報処理安全確保支援士試験に活用する方法
はじめに
情報処理安全確保支援士試験では、Webアプリケーションの脆弱性に関する問題が繰り返し出題されます。
対策としてよく紹介される書籍が、いわゆる「徳丸本」です。
- 『体系的に学ぶ 安全なWebアプリケーションの作り方』
- 著者:徳丸浩氏
Webセキュリティを体系的に学べる非常に優れた書籍ですが、ページ数が多く、HTML、JavaScript、PHPなどのコードも登場します。
そのため、開発経験が少ない人にとっては、次のように感じることがあります。
- どこから読めばよいか分からない
- コードをすべて理解する必要があるように感じる
- 読み終わる前に試験日を迎えそう
- 内容は理解できても、過去問で解答できない
本記事では、Web開発経験の少ない人が、情報処理安全確保支援士試験の午後問題対策として徳丸本を活用する方法を整理します。
結論からいうと、徳丸本は最初から最後まで順番に読む必要はありません。
過去問から必要な範囲を特定し、脆弱性の発生条件と対策をセットで理解することが重要です。
徳丸本を通読することが目的ではない
徳丸本はWebアプリケーションセキュリティを体系的に学ぶための書籍です。
一方、情報処理安全確保支援士試験に合格することが目的であれば、書籍の内容をすべて暗記する必要はありません。
試験対策では、次の順番で学習を進める方が効率的です。
- 過去問を確認する
- 出題された脆弱性を特定する
- 徳丸本の該当箇所を読む
- 脆弱性が発生する理由を理解する
- 対策方法を整理する
- 再び過去問を解く
つまり、
徳丸本を通読する
↓
過去問を解く
という一方向の学習ではなく、
過去問
↓
徳丸本
↓
過去問
という往復型の学習を行います。
過去問を先に見ることで、どこを重点的に読めばよいかが明確になります。
優先して学習したい脆弱性
Webセキュリティ分野では、特に次のようなテーマが重要です。
- クロスサイトスクリプティング
- SQLインジェクション
- クロスサイトリクエストフォージェリ
- セッション管理の不備
- OSコマンドインジェクション
- ディレクトリトラバーサル
- HTTPヘッダインジェクション
- 認可制御の不備
- ファイルアップロードに関する脆弱性
- オープンリダイレクト
- クリックジャッキング
すべてを同じ深さで学習するのではなく、過去問で頻繁に登場する項目から優先して確認します。
ただし、脆弱性の名称だけを覚えても、午後問題には対応できません。
重要なのは、次の流れを説明できることです。
どのような入力が行われるか
↓
入力値がどこで利用されるか
↓
なぜ不正な処理が実行されるか
↓
どのような被害が発生するか
↓
どのような対策が必要か
コードをすべて理解しようとしない
開発経験が少ない人が徳丸本を読むと、掲載されているコードの理解に時間を使いすぎることがあります。
しかし、試験対策としては、プログラム全体を理解する必要はありません。
見るべきなのは、脆弱性に関係する次の部分です。
- 外部から受け取った値
- 値を加工している処理
- HTMLやSQLに値を出力している箇所
- 認証や認可を判定している箇所
- セッション情報を利用している箇所
例えば、クロスサイトスクリプティングであれば、次の観点でコードを読みます。
- 利用者が入力した値は何か
- 入力値がどの変数に格納されるか
- その値がHTMLのどこに出力されるか
- エスケープ処理が行われているか
- ブラウザが入力値を文字列ではなくスクリプトとして解釈しないか
HTMLやPHPの構文を完全に理解できなくても、入力値の流れを追うことができれば、脆弱性が発生する理由を把握できます。
「ミクロ」と「マクロ」の両方で理解する
脆弱性を学ぶ際は、ミクロな視点とマクロな視点の両方が必要です。
ミクロな理解
ミクロな理解とは、具体的なコードや通信内容を追いながら、脆弱性が発生する仕組みを確認することです。
例えば、SQLインジェクションであれば、次のように確認します。
入力された文字列
↓
SQL文へ文字列連結
↓
入力値がSQLの構文として解釈される
↓
本来想定していない検索や更新が実行される
ここでは、具体的に「どの入力値が」「どこに入り」「どのようなSQLになるか」を確認します。
試験問題では、コードや通信内容を基に、攻撃が成立する理由を答えさせることがあります。
そのため、単に「SQLインジェクション対策はプレースホルダ」と暗記するだけでは不十分です。
マクロな理解
マクロな理解とは、脆弱性を一般化して整理することです。
各脆弱性について、最低限、次の項目をまとめます。
| 項目 | 内容 |
|---|---|
| 脆弱性名 | 何という脆弱性か |
| 発生条件 | どのような実装で発生するか |
| 原因 | なぜ攻撃が成立するか |
| 影響 | どのような被害が発生するか |
| 対策 | どのような実装に変更するか |
| 確認方法 | 何を見れば安全だと判断できるか |
例えば、クロスサイトスクリプティングは次のように整理できます。
| 項目 | 内容 |
|---|---|
| 発生条件 | 外部入力を適切に処理せずHTMLへ出力する |
| 原因 | 入力値がHTMLやスクリプトとして解釈される |
| 影響 | Cookieの窃取、偽画面の表示、不正操作など |
| 対策 | 出力先に応じたエスケープ処理を行う |
| 確認方法 | 外部入力の出力箇所とエスケープ処理を確認する |
この形式で整理しておくと、問題文の表現が変わっても対応しやすくなります。
「脆弱性」と「対策」をセットで覚える
試験対策では、脆弱性の名称と対策を別々に覚えないことが重要です。
次のように、発生条件と対策をセットで覚えます。
| 発生条件 | 対策 |
|---|---|
| SQL文を文字列連結で生成している | プレースホルダを利用する |
| 外部入力をHTMLにそのまま出力している | 出力先に応じてエスケープする |
| 状態変更処理にCSRF対策がない | 推測困難なトークンを検証する |
| セッションIDをURLに含めている | Cookieを利用し、安全な属性を設定する |
| ファイル名をそのままパスに結合している | ファイル名を制限し、固定ディレクトリで管理する |
| ログイン済みかだけを確認している | 操作対象に対する権限も確認する |
| リダイレクト先を利用者が自由に指定できる | 許可された遷移先だけを使用する |
この対応関係が頭に入っていると、午後問題で問われる「原因」と「改善方法」を書きやすくなります。
解答は「なぜ」を含めて書く
午後問題では、「対策を答えよ」と書かれていても、単語だけでは十分でないことがあります。
例えば、次の回答は具体性が不足しています。
エスケープ処理を行う。
より適切なのは、対象と目的を明確にした回答です。
利用者が入力した値をHTMLへ出力する際に、
HTMLの文脈に応じたエスケープ処理を行い、
入力値がスクリプトとして解釈されないようにする。
SQLインジェクションであれば、次のように書けます。
入力値をSQL文へ文字列連結せず、
プレースホルダを利用してSQLの構造と値を分離する。
解答を作る際は、次の3点を意識します。
何に対して
どのような処理を行い
何を防止するのか
学習ノートの作り方
徳丸本を読みながら、文章をそのまま書き写す必要はありません。
1つの脆弱性を1ページまたは1画面にまとめる方法がおすすめです。
# SQLインジェクション
## 発生条件
外部入力をSQL文へ文字列連結している。
## 発生する理由
入力値がデータではなくSQL構文として解釈されるため。
## 影響
- 認証回避
- 情報漏えい
- データ改ざん
- データ削除
## 対策
- プレースホルダを利用する
- SQL文の構造と値を分離する
- DB接続ユーザーの権限を必要最小限にする
## 過去問で確認するポイント
- SQL文の組み立て方
- 入力値の格納場所
- プレースホルダの有無
- DBユーザーの権限
ノートを作る目的は、情報をきれいにまとめることではありません。
問題を見たときに、原因と対策を思い出せる状態にすることです。
IPAの公開資料も確認する
徳丸本とあわせて、IPAが公開しているWebセキュリティ関連資料も確認しておくと効果的です。
特に「安全なウェブサイトの作り方」などの資料には、代表的な脆弱性と対策が整理されています。
IPAの資料を確認する利点は、次のとおりです。
- 試験で使われる表現に慣れられる
- 脆弱性と対策の対応関係を再確認できる
- 徳丸本で学んだ内容を簡潔に復習できる
- 開発者向けの基本的な対策を整理できる
徳丸本で仕組みを理解し、IPA資料で要点を再確認する使い方が効率的です。
おすすめの学習手順
実際の学習は、次の手順で進めます。
手順1:過去問を1問読む
最初から解けなくても問題ありません。
問題文を読み、登場する脆弱性や技術用語を確認します。
手順2:出題テーマを特定する
次のようなキーワードからテーマを判断します。
- 外部入力
- HTML出力
- SQL文
- Cookie
- セッションID
- トークン
- リダイレクト
- ファイル名
- アクセス権限
手順3:徳丸本の該当箇所を読む
関連する章だけを読みます。
この時点では、コードを完全に理解することよりも、攻撃が成立する流れを把握することを優先します。
手順4:原因と対策を自分の言葉でまとめる
次の形式で整理します。
この脆弱性は、
〇〇した値を△△で使用しているため発生する。
対策として、
□□を行い、××として解釈されないようにする。
手順5:過去問を解き直す
徳丸本を読んだ直後に、同じ問題をもう一度解きます。
解説を読んで理解したつもりになるのではなく、実際に文章として解答できるか確認します。
手順6:数日後に再度解く
時間を空けて解き直し、原因と対策を説明できるか確認します。
よくある失敗
最初からすべて読もうとする
徳丸本を1ページ目から順番に読み、理解できない箇所で止まってしまうパターンです。
試験対策では、過去問に関連する章から読んでも問題ありません。
コードの文法学習に時間を使いすぎる
PHPやJavaScriptの構文を調べ続け、脆弱性の学習が進まなくなることがあります。
コードは、入力値と出力先を追える程度の理解から始めます。
対策名だけを暗記する
「XSSはエスケープ」「SQLインジェクションはプレースホルダ」とだけ覚えると、少し変化した問題に対応できません。
なぜその対策が有効なのかまで説明できるようにします。
ノート作成が目的になる
きれいなノートを作ることに時間を使いすぎると、問題演習の時間が不足します。
ノートは、過去問を解くための検索可能なメモとして作ります。
過去問を最後まで取っておく
知識を身につけてから過去問を解こうとすると、出題傾向を把握できません。
過去問は実力確認だけでなく、学習範囲を決めるためにも利用します。
生成AIを補助的に使う
徳丸本や過去問を読んでいて、コードの意味が分からない場合は、生成AIを補助的に利用できます。
例えば、次のような質問が有効です。
このPHPコードで、利用者が入力した値が
どのようにHTMLへ出力されるか説明してください。
このSQL文にSQLインジェクションが発生する理由を、
SQL初心者向けに説明してください。
このコードについて、試験対策として確認すべき行だけを説明してください。
ただし、生成AIの回答をそのまま暗記するのではなく、徳丸本やIPA資料と照合することが重要です。
特にセキュリティ対策では、入力値の検証、出力時の処理、認証、認可などが混同される場合があります。
最終的には、信頼できる書籍や公式資料で確認します。
まとめ
Web開発経験の少ない人が徳丸本を活用する際は、すべてを理解しようとする必要はありません。
重要なのは、次のポイントです。
- 過去問を先に確認する
- 出題テーマに対応する章を読む
- 外部入力の流れを追う
- 脆弱性の発生条件を理解する
- 原因と対策をセットで整理する
- 対策が有効な理由を説明できるようにする
- 徳丸本と過去問を繰り返し往復する
徳丸本は、単に読むための本ではなく、過去問で分からなかった部分を調査するための辞書としても活用できます。
過去問で疑問を持つ
↓
徳丸本で仕組みを理解する
↓
原因と対策を整理する
↓
過去問で文章として解答する
このサイクルを繰り返すことで、開発経験が少ない人でも、Webセキュリティ問題に必要な考え方を身につけやすくなります。