情報処理安全確保支援士(SC、登録セキスペ)の科目B(旧・午後問題)には、HTMLやJava、SQLのコードが出てくる問題があります。「プログラミングが得意でないと解けないのでは」と、選ぶのをためらう人も多いと思います。
そこで、令和3年春期〜令和7年秋期の10回分(45問)から、コードを書かせる問題・読ませる問題を全部抜き出して、IPAの解答例と照らし合わせました。分析にはAI(Claude)も使っています。
結論から言うと、コードを一から書かせる問題は1問もありません。書かせるのは1行か1語で、答えのヒントはほぼ必ず問題文の中にあります。
科目B全体の出題傾向(出やすい分野ランキング・問題文のクセ・過去問リンク集)は、科目Bの出題傾向を10回分分析した記事にまとめています。この記事はその番外編です。
結論:コード問題は「4つのタイプ」しかない
- コード問題は、①空欄を書く ②問題文の書式に従って書く ③攻撃の入力値を書く・抜き出す ④読んで説明するの4タイプに分けられる
- 書かせるコードはプレースホルダ、例外処理、ハッシュ関数、正規表現、エスケープなど定番の書き方だけ
- 書き方の書式(記法)や変数名は、問題文の中に必ず書いてある。暗記より「問題文から拾う」力が問われる
過去10回のコード問題の一覧
| タイプ | 回・問 | 出たコード | 答えたもの |
|---|---|---|---|
| ① 空欄を書く | 令和6年春期 問4 | Java | ハッシュ関数名、throw、finally、行番号 |
| ① 空欄を書く | 令和5年春期 午後I 問1 | Java・SQL | プレースホルダ、PreparedStatement、static、new |
| ① 空欄を書く | 令和4年春期 午後I 問1 | Java・SQL | 変数名、SQLの条件式 |
| ② 書式に従って書く | 令和6年春期 問1 | WAFのルール | 正規表現 |
| ② 書式に従って書く | 令和5年春期 午後II 問2 | 検知ルール(JSON) | JSON形式のルール |
| ② 書式に従って書く | 令和3年秋期 午後II 問1 | HTTPレスポンス(HTML) | エスケープ後の文字列 |
| ③ 攻撃の入力値 | 令和7年秋期 問1 | HTML・JavaScript | XSSを仕込んだ文字列(HTMLから抜き出す) |
| ③ 攻撃の入力値 | 令和7年春期 問3 | JavaScript(1行) | 細工したURL |
| ③ 攻撃の入力値 | 令和6年秋期 問3 | HTML・JavaScript | 改ざんされたパラメータ名と値 |
| ③ 攻撃の入力値 | 令和4年春期 午後II 問1 | HTTPリクエスト | SSRFのために書き換える値 |
| ④ 読んで説明 | 令和5年秋期 問1 | HTML・JavaScript | 6〜20行目の処理内容(60字以内) |
| ④ 読んで説明 | 令和6年秋期 問3 | JavaScript | 4〜15行目の処理内容、書換え後の画面の図示 |
| ④ 読んで説明 | 令和7年秋期 問1 | JavaScript | スクリプトが悪用した機能 |
※リンクはIPAの問題冊子PDFの、その問題の最初のページに飛びます(ブラウザによっては1ページ目が開きます)。答えはIPAの解答例によるものです。
以下、タイプごとに「どんな状況で」「なぜその答えになるか」「問題文のどこが根拠か」を解説します。問題文は必要な部分だけを引用・要約しています。
タイプ①:コードの空欄を書く(Java・SQL)
令和6年春期 問4(問題PDF):ハッシュ関数・例外処理・finally
状況:Webの受注システムで、ユーザー登録のJavaクラスをセキュリティレビューする問題です。元のコードでは、パスワードを次のようにハッシュ化していました。
5: MessageDigest mdObj = MessageDigest.getInstance("SHA-1");
...
8: } catch (NoSuchAlgorithmException e) {
9: log.debug("error:" + e);
10: }
(出典:令和6年度 春期 情報処理安全確保支援士試験 午後 問4 図3より抜粋)
| 空欄 | 答え(解答例) | 問題文の根拠 |
|---|---|---|
| d(行番号) | 5 | 5行目の getInstance は、指定したアルゴリズムが使えないと例外を出す。例外が出ても9行目でログに書くだけなので、パスワードはハッシュ化されないまま保存される |
| e | 例外 | 同上 |
| f(ハッシュ関数名) | SHA-256(SHA-384・SHA-512も可) | 要件の表に「パスワードはCRYPTREC暗号リストの電子政府推奨暗号リストに記載されているハッシュ関数でハッシュ化」とある。SHA-1は要件を満たさない |
| g | throw new RuntimeException(e) | 修正後のコードにコメント「回復不能な例外発生」がある。ログに書いて先に進むのではなく、処理を止める |
| h | finally | 空欄の後ろのブロックで psObj.close() をしている。例外が起きても必ず実行してリソースを解放する構文 |
空欄gは、設問文に「ソースコード又は具体的な処理内容のいずれかで答えよ」とあります。Javaの書き方を覚えていなくても、「ランタイムエラーを例外としてthrowする」のように日本語で書けば正解になる設問です。
令和5年春期 午後I 問1(問題PDF):プレースホルダとレースコンディション
状況:納品書PDFをダウンロードするJavaクラスを静的解析したところ、SQLインジェクション・ディレクトリトラバーサル・リソースの解放漏れが見つかった、という問題です。元のコードは、利用者が入力した注文番号を文字列連結でSQLに埋め込んでいました。
8: sql = sql + " WHERE head.order_no = '" + inOrderNo + "' ";
10: Statement stmt = conn.createStatement();
11: ResultSet resultObj = stmt.executeQuery(sql);
修正後のコードは次の形で、空欄c・dを埋めます。
sql = sql + " [c] ";
sql = sql + (省略);
[d] ;
stmt.setString(1, inOrderNo);
ResultSet resultObj = stmt.executeQuery();
(出典:令和5年度 春期 情報処理安全確保支援士試験 午後I 問1 図1・図2より抜粋)
| 空欄 | 答え(解答例) | 問題文の根拠 |
|---|---|---|
| c | WHERE head.order_no = ? | 元の8行目の条件を、値の代わりに ?(プレースホルダ)にする |
| d | PreparedStatement stmt = conn.prepareStatement(sql) | 次の行が stmt.setString(1, inOrderNo)。変数名 stmt と、? に値を入れるメソッドがすでに書かれているので、それに合う宣言を書く |
| a(行番号) | 13 | ファイルのパス名を、利用者が入力した inOrderNo から組み立てている行 |
| b(変数名) | in | 解放されていないリソース。stmt・resultObj と並んで、ファイルを読む in も閉じていない |
後半では、別の得意先の注文情報が表示される不具合の原因を問われます。注文番号を保持する変数が private static String orderNo と宣言されていたため、複数のリクエストで1つの変数を共有してしまい、同時に処理すると値が入れ替わる、というものです。答えは static(空欄f)と「レースコンディション」で、修正後のコードでは new でインスタンスを作り、注文番号を引数 getOrderInfoBean(orderNo) で渡す形に直します。
令和4年春期 午後I 問1(問題PDF):変数名とSQLの条件
状況:プロジェクト内で情報を共有するWebアプリで、ほかのプロジェクトの情報が見えてしまう脆弱性を直す問題です。
| 空欄 | 答え(解答例) | 問題文の根拠 |
|---|---|---|
| b | PreparedStatement(解答群から選択) | SQLの中に ? が使われている |
| c | stmt | 同じ図の8行目で stmt = con.prepareStatement(sql) と宣言している変数名 |
| d | 情報番号 = ? AND プロジェクトID = ? | 設問に「図1中の属性名を含めて答えよ」とある。E-R図の情報管理テーブルの属性名を使い、情報番号だけでなく、利用者が参加しているプロジェクトIDでも絞り込む |
空欄dの決め手は、コードの注記の「10行目より後の(省略)に、projectId, documentNoを用いた処理はない」という一文です。後で絞り込む処理がないので、SQLの条件で両方を指定するしかないと分かります。
タイプ②:問題文の書式に従って書く
このタイプは、書き方のルール(記法)が問題文の図や表の中で定義されています。知らない記法でも、定義を読めば書けるのが特徴です。
令和6年春期 問1(問題PDF):WAFのルールを正規表現で書く
状況:ライブラリの脆弱性(JNDI Lookupを悪用する攻撃)に備えて、暫定的なWAFのルールを作る問題です。最初の案は「\Wjndi\W に一致したら遮断」でしたが、「jnDI」のように大文字・小文字を入れ替える手口で回避できることに気づき、案を変更します。
問題文の図5には、WAFルールの記述形式として「[xyz]:x、y又はzのいずれかにマッチする」「x|y:x又はyとマッチする」などが定義されています。
| 設問 | 答え(解答例) |
|---|---|
| 変更後のルールのパターン(図5の記述形式で) | \W[jJ][nN][dD][iI]\W(`\W(j |
| ルールの検証対象 | Header(攻撃コードがHTTPリクエストのヘッダの値として送られるため) |
(出典:令和6年度 春期 情報処理安全確保支援士試験 午後 問1。問題冊子では \ が ¥ で表記されています)
正規表現を覚えていなくても、図5の定義を見ながら1文字ずつ大文字・小文字の両方を許す形にすれば書けます。
令和5年春期 午後II 問2(問題PDF):検知ルールをJSON形式で書く
状況:クラウドに移行したサービスで、委託先(D社)の運用者がログを削除したときにアラートを出すルールを書く問題です。問題文には、ルールのパラメータの表(system・account・service・event)、正規表現の書き方([0-9] は0〜9のいずれか1文字など)、そしてルールの例が載っています。
答えは、例と同じ形で次のように書きます(解答例)。
{
"system": "4000",
"account": "11[1-9][0-9]",
"service": "オブジェクトストレージサービス",
"event": "オブジェクトの削除"
}
| 項目 | 根拠 |
|---|---|
| system:4000 | ログを保管するストレージのシステムIDが、構成要素の表で4000 |
| account:11[1-9][0-9] | 設問に「D社の利用者IDは1110〜1199」とある。表の注記の正規表現の規則で範囲を表す |
| service・event | ログ保管ストレージが使うサービスと、そのサービスで取り得るイベントの中から選ぶ |
(出典:令和5年度 春期 情報処理安全確保支援士試験 午後II 問2)
令和3年秋期 午後II 問1(問題PDF):エスケープ後の文字列
XSSの脆弱性診断で、<script>alert('XSS!')</script> を入力したときのレスポンスの空欄を埋める問題です。正しくエスケープされている箇所なので、< は <、> は > になります(各4字以内)。同じ問題の後半では、リンクのURLを出力する箇所で " が " に正しくエスケープされているのにXSSが起きる、という状況が出てきます。対策の解答例は「http://又はhttps://で始まるURLだけを出力するようにする」で、エスケープだけでは防げない、URLのスキームのチェック漏れを読み取らせる問題です。
(出典:令和3年度 秋期 情報処理安全確保支援士試験 午後II 問1)
タイプ③:攻撃の入力値を書く・抜き出す
令和7年秋期 問1(問題PDF):CSPを回避したXSS(抜き出し)
状況:SaaSのプロジェクト進捗管理画面に、期限切れタスクの名前が表示されます。元従業員がタスク名にスクリプトを仕込み、管理者が画面を開いたときに自分を管理者に昇格させた、という問題です。
このサービスは Content-Security-Policy: default-src 'self' を設定しているので、scriptタグ内に直接書いたスクリプトは実行されません(空欄bは「できない」)。そこで攻撃者は、スクリプトを .xlsx ファイルとしてサービス内にアップロードし、タスク名に次の文字列を登録しました。
個人タスク<script src="/files/F1234567890.xlsx"></script>
(出典:令和7年度 秋期 情報処理安全確保支援士試験 午後 問1 図2より)
空欄dは「図2から抜き出して答えよ」なので、自分で書く必要はありません。ポイントは、同じオリジンにアップロードしたファイルなら 'self' の制限を通ってしまうという仕組みを読み取ることです。下線①の「工夫」の答えも「図3のスクリプトをSサービス内にアップロードする工夫」です。
令和7年春期 問3(問題PDF):前方一致チェックをすり抜けるURL
スマホアプリの関数が、呼出し元のURLの先頭が https://www.a-sha.co.jp かどうかだけを確認していた、という問題です。攻撃者が取得したドメインを k-sha.co.jp としたときの細工したURLとして、解答例には次のものが挙がっています。
https://www.a-sha.co.jp.k-sha.co.jp/(先頭は一致するが、実際は攻撃者のドメイン)https://www.a-sha.co.jp@k-sha.co.jp/(@より前はユーザー情報として扱われる)https://k-sha.co.jp/
「先頭の文字列だけで判定する」チェックがなぜ危ないかを、具体的なURLで書けるかが問われています。
(出典:令和7年度 春期 情報処理安全確保支援士試験 午後 問3)
令和6年秋期 問3(問題PDF):改ざんされたパラメータ
ECサイトのJavaScriptファイルが攻撃者のファイルに置き換えられ、支払方法の選択画面のHTMLが書き換えられた問題です。「画面遷移で使うパラメータの値が変更され、支払方法がクレジットカード決済に固定されていた」という下線について、パラメータ名とその値を答えます。
答えは、パラメータ名 order[Payment]、値 1 です。問題文のHTMLソースで、クレジットカード決済のラジオボタンが name="order[Payment]" value="1"、銀行振込が value="2" になっていることと、攻撃者のスクリプトが value="1" の隠しフィールドを埋め込んでいることを照らし合わせれば分かります。
(出典:令和6年度 秋期 情報処理安全確保支援士試験 午後 問3)
令和4年春期 午後II 問1(問題PDF):SSRFのために書き換える値
外部のニュースを取得するリクエストの topic パラメータに、ニュースのURLが入っている問題です。SSRFの脆弱性を確認するために、topic の値を別のサーバのURL(解答例では https://db-y.b-sha.co.jp/)に変更した、と答えます。リクエストのどの値を、どこに向けて書き換えるかを本文から特定する問題です。
(出典:令和4年度 春期 情報処理安全確保支援士試験 午後II 問1)
タイプ④:コードを読んで説明する
令和5年秋期 問1(問題PDF):XSSで送り込まれたスクリプトの処理内容
商品レビューに、文字数制限を回避するために複数回に分けてスクリプトが投稿された問題です。抽出されたスクリプトの「6〜20行目の処理の内容を60字以内で」答えます。
スクリプトの流れは次のとおりです。
- プロフィールのページを取得し、その中から
tokenを取り出す(7〜8行目) document.cookie(セッションIDを含む)を中身にしたa.pngというファイルを作る(13〜16行目)- アイコン画像のアップロード先に、ファイルとトークンを送る(17〜19行目)
解答例は「XHRのレスポンスから取得したトークンとともに、アイコン画像としてセッションIDをアップロードする」です。行ごとの説明を並べるのではなく、全体として「何を、どこに、どうする」処理なのかを1文にまとめるのがコツです。
(出典:令和5年度 秋期 情報処理安全確保支援士試験 午後 問1)
令和6年秋期 問3(問題PDF):書き換えられた画面と、カード情報の送信先
上と同じECサイトの問題です。攻撃者のスクリプトの「4〜15行目の処理内容を具体的に」答えます。解答例は「addEventListenerメソッドでフォーム要素にイベントリスナーを登録し、submit時にクレジットカード情報をクエリパラメータとして攻撃者のサイトに送信する」です。
この問題では、スクリプトが書き換えた後の画面を「図示せよ」という設問もあります。innerHTML で差し込まれたHTML(カード番号・有効期限・名義・セキュリティコードの入力欄)を読んで、画面の絵を描かせるという珍しい形です。
(出典:令和6年度 秋期 情報処理安全確保支援士試験 午後 問3)
令和7年秋期 問1(問題PDF):スクリプトが悪用した機能
タイプ③で紹介した問題の続きです。アップロードされたスクリプトは、ロール設定画面からCSRF対策のトークンを取り出し、is_admin=1 を付けてロール変更のリクエストを送っていました。設問は「表1中のどの機能を悪用するものか」で、答えは「ロール管理」です。スクリプト中のURL(/management/role)を、機能一覧の表の説明と照らし合わせるだけで答えが出ます。
(出典:令和7年度 秋期 情報処理安全確保支援士試験 午後 問1)
本番までに書けるようにしておく定番コード
過去10回で答えになったものを、1枚にまとめました。
| 目的 | 答えになった書き方 | 出た回 |
|---|---|---|
| SQLインジェクション対策 | WHERE 列名 = ?、PreparedStatement stmt = conn.prepareStatement(sql) | 令和5年春 午後I、令和4年春 午後I |
| アクセス制御をSQLで | 情報番号 = ? AND プロジェクトID = ? | 令和4年春 午後I |
| 例外処理 | throw new RuntimeException(e) | 令和6年春 |
| リソースの確実な解放 | finally | 令和6年春 |
| パスワードのハッシュ化 | SHA-256(SHA-384・SHA-512) | 令和6年春 |
| レースコンディションの原因 | static 変数を複数のリクエストで共有 | 令和5年春 午後I |
| XSS対策(エスケープ) | < > " | 令和3年秋 午後II |
| WAFのルール | \W[jJ][nN][dD][iI]\W(大文字・小文字の両方を許す) | 令和6年春 |
| 範囲を表す正規表現 | 11[1-9][0-9] | 令和5年春 午後II |
コード問題を解くときのコツ
| コツ | 理由 |
|---|---|
| 空欄の前後の行を先に読む | 変数名やメソッド名は、空欄の直後の行で使われていることが多い(stmt.setString(...) など) |
| 書式・記法の定義を探す | 正規表現もJSONも、問題文の図や表の注記に書き方が定義されている |
| 「ソースコード又は処理内容のいずれかで」とあれば日本語で書いてよい | 書き方を思い出せなくても、処理の意味が分かれば点になる |
| 「〇行目の処理内容」は1文にまとめる | 「何を・どこに・どうする」の形で、行ごとの説明は並べない |
| コードの注記・コメントを読み飛ばさない | 「10行目より後に〇〇を用いた処理はない」「回復不能な例外発生」など、答えを決める一文が入っている |
CBTの科目Bでは、問題文にマーカーを引けます。空欄の前後の行や注記には、先にマーカーを引いておくと見落としにくくなります(CBTの画面の使い方は出題傾向の記事に書いています)。
まとめ
- 科目Bのコード問題は、①空欄を書く ②書式に従って書く ③攻撃の入力値 ④読んで説明するの4タイプ
- 書かせるのは1行か1語で、プレースホルダ・例外処理・ハッシュ関数・正規表現・エスケープなど定番の書き方だけ
- 書式や変数名は問題文の中にある。空欄の前後の行、図表の注記、コメントから拾う
- 「処理内容を答えよ」は、全体を「何を・どこに・どうする」の1文にまとめる
- Web系の問題を選ぶなら、HTMLとJavaScriptを読めるようにしておくと選べる問題が増える
コードの解説を動画で見たいときは、私も使っているUdemyの講座が役に立ちます。XSS・CSRF・Webアプリの脆弱性などを短く解説する「小問題解説」と、科目Bの過去問解説が入っています。
令和8年度対応|参考書の著者が教える 情報処理安全確保支援士 科目A・科目B対策(Udemy)
講座の内容を見る
関連記事
- 情報処理安全確保支援士 科目B(午後)の出題傾向を分析|出やすい分野ランキングと過去問リンク集
- 【受験結果84点】情報処理安全確保支援士 科目A-2の問題予想と新規問題対策
- 情報処理安全確保支援士の午前IIは3分の1が過去問の再出題でした
- 情報処理安全確保支援士(登録セキスペ)に挑戦します【学習計画・教材】
- 支援士 科目B(午後)のインシデント対応・ログ解析問題の解き方|ログは「時系列に並べて、2つのログで裏付ける」【過去問2問で解説】
参考にした情報
- IPA 過去問題(令和3年春期〜令和7年秋期の午後問題・解答例・採点講評)
この記事で引用したコードと設問は、IPAが公開している過去問題からの抜粋です。一部を省略・要約しています。
よくある質問(FAQ)
Q1. 支援士の科目Bで、プログラムを一から書かせる問題はありますか?
令和3年春期〜令和7年秋期の10回分にはありません。コードを書かせる問題は、既存のコードの空欄に1行か1語を入れる形か、問題文で定義された書式(正規表現・JSONなど)に従って書く形だけです。
Q2. 科目Bのコード問題で使われる言語は何ですか?
空欄を埋める問題はJavaとSQLです。読ませる問題では、HTMLとJavaScript(ECMAScript)がよく出ます。ほかに、WAFのルールの正規表現や、クラウドの検知ルールのJSONが出たことがあります。
Q3. Javaが書けなくても、Java の問題を選んで大丈夫ですか?
令和6年春期 問4のように「ソースコード又は具体的な処理内容のいずれかで答えよ」という設問もあり、処理の意味が分かれば日本語で答えて正解できます。答えの多くはプレースホルダ・例外処理・finallyなど定番の書き方で、変数名も問題文のコードから拾えます。
Q4. 「〇行目の処理内容を答えよ」はどう書けばいいですか?
行ごとの説明を並べるのではなく、全体として「何を、どこに、どうする」処理なのかを1文にまとめます。たとえば令和5年秋期 問1の解答例は「XHRのレスポンスから取得したトークンとともに、アイコン画像としてセッションIDをアップロードする」です。