復習問題 2026-09-30
昨日も学習メモは届いていないので、軸はネットワーク(記録上15問・30%でいちばん低い分野)のままです。今日は昨日の5問のすぐ隣で組みました。第1問は昨日の第1問の最後に出てきた「別ネットワーク宛てはデフォルトゲートウェイへ投げられる」の続き、第2問は昨日 NAPT で出てきたポート番号を持っている TCP と UDP、第3問は昨日の表で空欄のまま残っていた SQL インジェクション、第4問は正規化からひとつ進めて集計の SQL、第5問は昨日の「相手の公開鍵で隠す、自分の秘密鍵で署名する」の一段上、ディジタル証明書です。
第1問 ネットワーク(ARP とデフォルトゲートウェイ)
PC がパケットを送信するとき、宛先 IP アドレスに対応する MAC アドレスを ARP で直接問い合わせるのはどの場合か。
- 宛先が自分と同じネットワーク内にあるとき
- 宛先が別のネットワークにあるとき
- 宛先がグローバル IP アドレスのとき
- 宛先のドメイン名が DNS で解決できたとき
解答
解答: a
昨日の第1問は、192.168.10.0/26 から見て .70 は別ネットワークだ、というところで終わりました。では別ネットワークだと分かった PC は次に何をするのか——それが今日の問題です。
大前提として、実際にフレームを運ぶイーサネットは MAC アドレスしか見ません。つまり送信するには必ず「次に渡す相手の MAC アドレス」が要ります。PC はサブネットマスクの計算結果で、その相手を2通りに切り替えます。
| 宛先の判定 | MAC アドレスを聞く相手 | フレームの宛先 MAC |
|---|---|---|
| 同じネットワーク | 宛先そのものに ARP で聞く | 宛先 PC の MAC |
| 別のネットワーク | デフォルトゲートウェイに ARP で聞く | ルータの MAC |
ここが午前で狙われる点です。別ネットワーク宛てでも、IP ヘッダの宛先 IP は最終目的地のままで変わりません。変わるのは外側のフレームの宛先 MAC だけで、ルータを1つ越えるたびに書き換えられていきます。「IP は端から端まで、MAC は隣の1区間だけ」と覚えると混ざりません。
b は誤りで、この場合に ARP で聞くのはゲートウェイの MAC であって宛先の MAC ではありません(そもそも別ネットワークの機器には ARP のブロードキャストが届きません。ARP は同じネットワーク内にしか流れないからです)。c はグローバルかプライベートかという別の切り口で、判定に使われるのはサブネットマスクとの計算結果だけです。d は名前から IP を引く DNS の話で、ARP はその後段——IP から MAC を引く段——にあたります。
3つのアドレスの並びで整理しておくと、この先の問題でも迷わなくなります。
| 引きたいもの | 手がかり | 仕組み |
|---|---|---|
| IP アドレス | ドメイン名 | DNS |
| MAC アドレス | IP アドレス | ARP |
| IP アドレス(自分の) | —(起動時に借りる) | DHCP |
第2問 ネットワーク(TCP と UDP)
TCP と UDP の説明として適切なものはどれか。
- TCP はコネクションレス型で、再送制御を行わない
- TCP はコネクション型で、到達確認と再送によって信頼性を確保する
- UDP はコネクション型で、パケットの順序制御を行う
- UDP はポート番号を使わないため、1台につき1つの通信しか行えない
解答
解答: b
昨日の NAPT は「IP アドレス+ポート番号を書き換える」仕組みでした。そのポート番号を持っているのがこの2つ、トランスポート層のプロトコルです。ここを押さえると NAPT の話が一段はっきりします。
| TCP | UDP | |
|---|---|---|
| 接続 | コネクション型(3ウェイハンドシェイク) | コネクションレス型 |
| 信頼性 | 到達確認・再送・順序制御あり | なし(投げっぱなし) |
| 速度・オーバヘッド | 遅い・大きい | 速い・小さい |
| 主な用途 | HTTP、SMTP、FTP | DNS、DHCP、VoIP、動画配信 |
選び分けの基準は「届かなかったときに困るか、遅れる方が困るか」の一点です。ファイルは1バイト欠けたら壊れるので TCP。通話や動画は、欠けた音を再送してもらっても遅れて届くだけで意味がないので UDP。昨日出てきた DHCP が UDP なのは、そもそもまだ自分の IP アドレスが無い状態でブロードキャストする必要があり、コネクションを張れないからです。
a と c は TCP と UDP を入れ替えた誤答で、この2つは毎回このパターンで作られます。d は明確な誤りで、UDP にもポート番号はあります(DNS は 53、DHCP は 67/68)。ポート番号はトランスポート層の機能で、どちらにも共通です。
ウェルノウンポートは午前でそのまま問われるので、よく出るものだけ。
| 番号 | プロトコル | 番号 | プロトコル |
|---|---|---|---|
| 20 / 21 | FTP | 80 | HTTP |
| 22 | SSH | 110 | POP3 |
| 25 | SMTP | 443 | HTTPS |
| 53 | DNS | 67 / 68 | DHCP |
第3問 情報セキュリティ(SQL インジェクション対策)
Web アプリケーションにおける SQL インジェクションへの対策として最も適切なものはどれか。
- 利用者の入力値を画面へ出力するとき、記号を HTML エスケープする
- SQL 文の組立てにプレースホルダ(バインド機構)を用いる
- リクエストに第三者が推測できないトークンを埋め込み、サーバ側で照合する
- ログイン失敗が一定回数続いたらアカウントをロックする
解答
解答: b
昨日の表で名前だけ出して中身に触れていなかった行です。これで「攻撃と対策」の主要4つが揃います。
SQL インジェクションは、入力値がデータではなく SQL 文の一部として解釈されてしまう攻撃です。たとえば WHERE 名前 = '入力値' という文を文字列連結で組み立てていると、入力に ' OR 'A'='A と書かれた瞬間に条件が常に真になり、全件が返ります。原因は文法と値が混ざることにあります。
プレースホルダは、先に WHERE 名前 = ? という形で SQL の文法を確定させ、値は後から ? の場所へはめ込みます。値の中に ' や OR が入っていても、文法はもう決まったあとなのでただの文字として扱われる——これが効く理由です。XSS と対にして覚えると筋が通ります。
| 攻撃 | 混ざってしまう場所 | 対策 |
|---|---|---|
| XSS | HTML に script が混ざる | 出力時のエスケープ |
| SQL インジェクション | SQL 文に文法が混ざる | プレースホルダ |
| CSRF | (混入ではなく)他サイトからの偽リクエスト | トークンの照合 |
| ディレクトリトラバーサル | ファイルパスに ../ が混ざる | パス名を直接指定させない |
a は昨日の第3問の答え(XSS)、c は一昨日の答え(CSRF)、d はパスワードリスト攻撃・総当たり攻撃への対策です。「エスケープ=XSS、プレースホルダ=SQL、トークン=CSRF」の3語だけで午前のこの手の問題はほぼ処理できます。8/22 に「トークンと エスケープが混ざる」と書いてあったところは、3つ目を足しても混ざらない形になりました。
なお午後 問1 では「入力値のチェックだけでは不十分な理由を述べよ」という形でよく問われます。答えの筋は、チェックは想定した文字の漏れに弱く、プレースホルダは文法が確定しているので漏れという概念自体が無い——という対比です。
第4問 データベース(GROUP BY と HAVING)
関係「受注明細(伝票番号, 商品番号, 数量)」から、商品番号ごとの数量の合計を求め、その合計が 100 を超える商品番号だけを取り出す SQL 文はどれか。
SELECT 商品番号, SUM(数量) FROM 受注明細 WHERE SUM(数量) > 100 GROUP BY 商品番号SELECT 商品番号, SUM(数量) FROM 受注明細 GROUP BY 商品番号 HAVING SUM(数量) > 100SELECT 商品番号, SUM(数量) FROM 受注明細 HAVING SUM(数量) > 100 GROUP BY 商品番号SELECT 商品番号, SUM(数量) FROM 受注明細 GROUP BY SUM(数量) HAVING 商品番号 > 100
解答
解答: b
昨日は同じ「受注明細」を正規化の側から見ました。今日はそれを取り出す側です。午後 問6 は正規化と SQL の2本立てで出るので、両方から触っておきます。
要は WHERE と HAVING の違い1点だけで、判定基準は「集計の前か、後か」です。
| WHERE | HAVING | |
|---|---|---|
| 効くタイミング | グループ化の前(1行ずつ絞る) | グループ化の後(グループを絞る) |
| 集計関数 | 書けない | 書ける |
| 例 | WHERE 数量 > 0 | HAVING SUM(数量) > 100 |
a は WHERE に SUM() を書いており誤りです。WHERE が動く時点ではまだ行が1本ずつバラバラで、合計は計算されていません。この「まだ存在しないものは参照できない」という順番が、そのまま句の並び順にもなっています。
c は句の順序が逆で構文エラー。SQL は書く順番が決まっています。
SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY
d は GROUP BY SUM(数量) という集計値でのグループ化になっており、求めているものと違います。グループ化するのはまとめたい単位の列(ここでは商品番号)です。
実行される順番で読むと丸ごと納得できます。FROM で表を出し、WHERE で行を絞り、GROUP BY で商品番号ごとの束にし、HAVING で束を絞り、最後に SELECT で列を選ぶ——書く順と実行順が違うのは SELECT だけ、と覚えておけば十分です。
第5問 情報セキュリティ(ディジタル証明書と認証局)
ディジタル証明書(公開鍵証明書)の説明として正しいものはどれか。
- 認証局(CA)が、利用者の公開鍵に対して認証局の秘密鍵で署名したもの
- 認証局(CA)が、利用者の秘密鍵に対して利用者の公開鍵で署名したもの
- 利用者が、自分の公開鍵を共通鍵暗号で暗号化したもの
- 認証局(CA)が、利用者の公開鍵を利用者の秘密鍵で暗号化したもの
解答
解答: a
昨日の第5問で「相手の公開鍵で隠す、自分の秘密鍵で署名する」まで来ました。今日はその穴を埋める問題です。
穴というのはこういうことです。公開鍵は誰でも配れる。ということは、攻撃者が「これが B の公開鍵です」と言って自分の公開鍵を配ることもできてしまいます。そうなると A はそれを B の鍵だと信じて暗号化し、中身は攻撃者に読まれます(中間者攻撃)。公開鍵暗号そのものは、その鍵が本当に本人のものかを保証しません。
そこで、信頼できる第三者である認証局が「この公開鍵は確かに B のものです」と保証書を出す。その保証書がディジタル証明書で、中身は利用者の公開鍵+持ち主の情報に、認証局の秘密鍵で署名を付けたものです。昨日の表の下の行——「作れるのは本人だけだから証明になる」——を、認証局が自分の鍵でやっている形です。
| 登場人物 | 使う鍵 | すること |
|---|---|---|
| 認証局 | 認証局の秘密鍵 | 利用者の公開鍵に署名する(証明書を発行) |
| 検証する側 | 認証局の公開鍵 | 署名を検証し、証明書が本物か確かめる |
「では認証局の公開鍵は誰が保証するのか」と続きますが、ここはルート証明書としてブラウザや OS にあらかじめ組み込まれていることで打ち止めになります。この連なりが信頼の連鎖(トラストチェーン)で、全体の枠組みを PKI(公開鍵基盤)と呼びます。HTTPS でブラウザが証明書を検証しているのが、まさにこの手順です。
b は署名の対象が秘密鍵になっており誤り。秘密鍵は誰にも渡さないものなので、認証局に預ける時点で成り立ちません。c は共通鍵を渡す方法がなく(昨日の鍵配送問題そのもの)、そもそも公開鍵は隠す必要がありません。d は利用者の秘密鍵で暗号化しており、それでは利用者が自分で自分を保証しているだけで、第三者の保証になりません。
失効の扱いも一緒に。秘密鍵が漏れた証明書は有効期限内でも無効にする必要があり、その一覧が CRL(証明書失効リスト)、1件ずつ問い合わせる仕組みが OCSP です。名前だけでも出ます。
今日もこの5問だけで達成です。計算は1つもありません。第1問と第2問は表を1つ覚えれば済む種類、第4問は「WHERE は集計の前、HAVING は集計の後」の一行だけです。
第3問で、8/22 に「混ざる」と書いてあったトークンとエスケープの話に3つ目(プレースホルダ)が足されました。混ざっていたものは、増やして並べた方がかえって固まります。