情報処理安全確保支援士 2013年 春期 午後2 問01
業務パッケージの開発に関する次の記述を読んで、設問1~4に答えよ。
U社は、従業員数100名のソフトウェア開発会社で、以前は受託開発を主に行っていたが、数年前から業務パッケージの開発も手がけるようになり、業績を伸ばしている。今回、新たに美容室向けの自社製品として、表1の機能を備えた美容室管理システム(以下、HSSという)を開発することが決まり、M専務が開発責任者になった。M専務は、美容室がHSSを運用することは難しいと考え、U社がHSSを運用し、インターネット経由で美容室へサービスを提供する、いわゆるSaaS型の商品とすることにした。また、美容室間の情報の独立性を高めるために、美容室ごとに仮想サーバを用意し、その上でHSSを運用することにした。

〔機能要件の定義〕
M専務は、HSSの要件定義から詳細設計までを担当するグループ(以下、Sグループという)を編成し、T主任をリーダに任命した。Sグループは、HSSの想定契約先に関する調査などを行い、機能要件の定義を行った。そのうち、顧客管理と予約管理に関する機能要件は、それぞれ図1、図2のとおりである。



なお、HSSでは美容室の従業員及び顧客の利用時に認証を行う。
〔システム・ソフトウェア要件定義〕
Sグループは、システム方式設計及びソフトウェア要件定義を開始し、まず図3のとおり、ソフトウェア構成を決定した。
なお、図3中の太線枠内が、今回HSSとして開発するWebアプリケーションである。

〔リスクアセスメント〕
M専務は、HSSでは、美容室が顧客から取得した個人情報を含む情報資産を取り扱うことから、情報の漏えいや滅失の可能性を評価するためにリスクアセスメントを実施し、その結果に基づきソフトウェア要件の中でセキュリティ仕様を定めることにした。この作業を、ソフトウェア要件定義の他のタスクと並行して行うために、Sグループとは別のグループ(以下、Rグループという)を編成した。
Rグループでは、次の(1)~(3)の手順に従ってリスクアセスメントを実施した。
(1) 表2のように、美容室における情報資産の分類を定義した。
(2) 表3のように、HSSで取り扱う情報資産を特定し、情報セキュリティの3要素に照らして情報資産の分類を行った。
(3) 各情報資産に対する脅威と脆弱性を特定し、それぞれについてリスク分析を行い、その結果を取りまとめた。そのうち、顧客データに対する結果を表4に示す。



〔セキュリティ仕様の決定〕
Rグループはリスク分析の結果から、Webアプリケーションに係るセキュリティ仕様とHSSの運用管理に関する要件を取りまとめた。そのうち、顧客管理機能に関するセキュリティ仕様を表5に、HSSの運用管理に関する要件を表6に示す。


Rグループは、検討したセキュリティ仕様と運用管理に関する要件をM専務に報告し、その承認を受けた。
〔予約管理機能の不具合〕
その後、HSSの開発は順調に進み、予約管理機能のうち、顧客が操作する画面の機能テストを開始した。予約管理機能の画面遷移を図4に示す。

機能テストの結果、複数の予約を同時に処理した場合、画面上では正常に予約が完了したように見えるにもかかわらず、データベースには反映されていないことがあるという不具合が発見された。不具合の原因と思われるプログラムは、図5、図6のとおりである。また、データベースのテーブルは、図7、図8のとおりである。






不具合の発見を受けて、図5及び図6について、顧客αと顧客βがそれぞれのブラウザから操作を行うことを想定して、ソースコードレビューを行った。
その結果、顧客αと顧客βが、画面2で空き状態であった同一の予約枠をほぼ同時に選択した場合、表7に示す順序で各処理が完了すると、顧客αの仮予約がデータベースに反映されないことが確認できた。

さらに、①空き状態であった予約枠を、顧客αが画面2で選択して画面3に進むのと並行して、同一の予約枠を顧客βが画面2で選択した場合、表8に示す順序で各処理が完了すると、顧客βの個人情報が顧客αの画面4に表示されてしまうことが確認できた。

〔予約管理機能における不具合の修正〕
Sグループのリーダとしてソースコードレビューに参加していたT主任は、この不具合を修正するために、executeUpdateメソッドでUPDATE文を実行したとき、更新した行数が戻り値になることに着目した。そして、図5の25行目のパラメタ付きSQL文のWHERE句を修正した上で、図5の60行目のexecuteUpdateメソッドの実行時に異常の発生を検知する仕組みを提案した。この提案に基づき修正されたプログラムは図9のとおりである。

〔販売の開始〕
U社はその後もHSSのテストを続け、更にいくつかの不具合を発見し、プログラムの修正を行った。その結果、テストを完了し、予定どおりに発売日を迎えることができた。発売後、HSSは順調に契約数を伸ばしており、U社の業績向上に寄与している。
設問1:〔リスクアセスメント〕について、(1)、(2)に答えよ。
(1)表3中のaに入れる適切な字句を答えよ。
模範解答
a:機密性
解説
解答の論理構成
- 問題文では、Rグループが情報資産を「情報セキュリティの3要素」に照らして分類したと記載しています。
“HSSで取り扱う情報資産を特定し、情報セキュリティの3要素に照らして情報資産の分類を行った。”
- 情報セキュリティの3要素は、一般に「機密性・完全性・可用性(Confidentiality, Integrity, Availability)」です。
- 表3の見出しを確認すると、
“aに係る分類/完全性に係る分類/可用性に係る分類”
と並んでおり、「完全性」「可用性」は既に記載済みです。 - 残る1要素は「機密性」であり、これが a に入るべき語句となります。
結論: a = 機密性
誤りやすいポイント
- CIAの順番に惑わされる
「C → I → A」の順序を覚えていても、表3では「完全性」「可用性」が後ろに並んでいるため、先頭が「機密性」であることを見落としがちです。 - “安全性”や“秘匿性”といった類義語を解答に書いてしまう
設問は「字句」を求めており、情報セキュリティの標準用語である「機密性」を使わないと誤答になります。 - リスクアセスメント=可用性重視と短絡的に考える
可用性を重視しても、3要素のうち欠けているものを補完する問題であると気付かなければなりません。
FAQ
Q: 機密性・完全性・可用性の中で、どれを優先すべきか判断基準はありますか?
A: システムや業務の性質によります。顧客情報を扱う本問のようなケースでは、まず「機密性」が重視されますが、取引や生産制御システムでは「可用性」が最優先になることもあります。リスク分析で被害・発生確率を評価し、バランスを決定します。
A: システムや業務の性質によります。顧客情報を扱う本問のようなケースでは、まず「機密性」が重視されますが、取引や生産制御システムでは「可用性」が最優先になることもあります。リスク分析で被害・発生確率を評価し、バランスを決定します。
Q: “秘匿性”と“機密性”の違いは何ですか?
A: 意味合いは近いですが、情報セキュリティの国際標準や試験問題では “Confidentiality” の日本語訳として「機密性」が正式に用いられます。試験では正式用語を使うことが重要です。
A: 意味合いは近いですが、情報セキュリティの国際標準や試験問題では “Confidentiality” の日本語訳として「機密性」が正式に用いられます。試験では正式用語を使うことが重要です。
Q: 表の分類でIIIが最も低いリスクレベルですが、IIIであっても対策は不要ですか?
A: いいえ。IIIは「直接的には大きな被害や影響は発生しない」レベルですが、組み合わせや二次被害により影響が拡大することがあります。管理策の優先度は下がりますが、無視はできません。
A: いいえ。IIIは「直接的には大きな被害や影響は発生しない」レベルですが、組み合わせや二次被害により影響が拡大することがあります。管理策の優先度は下がりますが、無視はできません。
関連キーワード: 機密性、CIA, 情報資産、リスクアセスメント、セキュリティ分類
設問1:〔リスクアセスメント〕について、(1)、(2)に答えよ。
(2)表4中のb、cに入れる適切な字句を解答群の中から選び、記号で答えよ。
解答群
ア:管理端末の保守体制の不備
イ:推測可能なパスワード
ウ:耐震性能の不足
エ:データセンタの施錠管理不良
オ:美容室の施錠管理不良
カ:防火体制の不備
模範解答
b:イ
c:オ
解説
解答の論理構成
- 表4を見ると、リスク No.1 と 7 では脅威がそれぞれ
「インターネット経由のHSSへの不正アクセス」
「美容室従業員による不正アクセス」
となっており、いずれも “不正アクセス” がテーマです。これらの脆弱性欄には同じ b が入ります。 - 不正アクセスの典型的な脆弱性は、平易で当てやすいパスワードの使用です。解答群で該当するのは「イ:推測可能なパスワード」です。
- リスク No.5 と 6 の脅威は「美容室従業員による物品持ち去り」で、被害は「情報へのアクセス不能」です。ここでは機器や記録媒体が持ち去られる物理的リスクを示しています。
- 物理的持ち去りを招く脆弱性は施錠管理の甘さに起因します。選択肢で対応するのは「オ:美容室の施錠管理不良」です。
- 以上より
・b = 「イ:推測可能なパスワード」
・c = 「オ:美容室の施錠管理不良」
となります。
誤りやすいポイント
- 「エ:データセンタの施錠管理不良」を選ぶと、物理リスク対象が美容室ではなくデータセンタである点を見落としてしまいます。
- リスク No.1,7 を“ネットワーク機器の設定不備”と誤解し「ア:管理端末の保守体制の不備」を選ぶケースがありますが、表4の被害欄は「情報漏えい」であり、パスワード強度との関連が濃厚です。
- 「カ:防火体制の不備」「ウ:耐震性能の不足」は可用性の低下に直結するものの、持ち去りという行為とは結び付かないため不適切です。
FAQ
Q: 不正アクセスに対して他の脆弱性(例:セキュリティホール)も考えられますが、なぜパスワード関連と断定できるのですか?
A: 表4でセキュリティホールはすでに別の行(リスク No.2,3)で扱われています。同じ脅威グループで脆弱性が重複しないよう整理されることが多く、残る代表例が「推測可能なパスワード」になるためです。
A: 表4でセキュリティホールはすでに別の行(リスク No.2,3)で扱われています。同じ脅威グループで脆弱性が重複しないよう整理されることが多く、残る代表例が「推測可能なパスワード」になるためです。
Q: リスク No.6 が「不要」対応になっているのはなぜですか?
A: 表4では発生確率「低」・深刻度「中」で評価され、リスク受容の範囲内と判断されたためです。施錠管理改善が不要という意味ではなく、優先度の問題です。
A: 表4では発生確率「低」・深刻度「中」で評価され、リスク受容の範囲内と判断されたためです。施錠管理改善が不要という意味ではなく、優先度の問題です。
Q: 物理的脆弱性の切り分けで「データセンタ」と「美容室」の違いを確認するコツは?
A: 脅威欄の主体を見ます。「美容室従業員」はデータセンタに立ち入れません。舞台が美容室であることを示す重要ヒントになります。
A: 脅威欄の主体を見ます。「美容室従業員」はデータセンタに立ち入れません。舞台が美容室であることを示す重要ヒントになります。
関連キーワード: 不正アクセス、パスワード強度、物理セキュリティ、リスクアセスメント
設問2:〔セキュリティ仕様の決定〕について(1)〜(4)に答えよ。
(1)表5中のdに入れる適切な字句を30字以内で述べよ。
模範解答
d:当該アカウントの認証時に待ち時間を挿入する。
解説
解答の論理構成
-
表5の要求箇所を確認
- 「顧客の認証」の仕様には、
「パスワードの入力を所定回数連続して誤った場合、d。」
と明示されています。
- 「顧客の認証」の仕様には、
「パスワードの入力を所定回数連続して誤った場合、d。」
-
リスクとのひも付け
- 同じ行の「リスク No.」欄に “1, 4” とあり、表4より
・リスク1:『インターネット経由のHSSへの不正アクセス』
・リスク4:『脆弱な認証とアクセス権管理の仕組み』
が対象であると分かります。 - これらはいずれも総当たりや辞書攻撃など多数回のログイン試行を想定した脅威です。
- 同じ行の「リスク No.」欄に “1, 4” とあり、表4より
-
適切な対策を導く
- パスワードポリシだけでは試行回数を抑止できないため、連続失敗時に追加の遅延やロックを行い、攻撃効率を下げる必要があります。
- 「所定回数連続して誤った場合」に続く動作としては、
・一定時間のアカウントロック
・次の認証処理で待ち時間を入れる
が代表的です。 - 本設問は「認証時に行う動作」を尋ねており、待ち時間の挿入が自然な記述となります。
-
結論
- よってdには
「当該アカウントの認証時に待ち時間を挿入する」
が入るのが妥当です。
- よってdには
誤りやすいポイント
- 「アカウントを即時無期限ロック」と答える
→ 正当利用者まで締め出し、DoS を招く恐れがあるため要件オーバー。 - 「パスワードをリセットさせる」と誤記
→ リセットは本人確認手続きが別途必要で、ここで求める“連続失敗への即時対応”とずれる。 - “CAPTCHA を表示”とする
→ CAPTCHA はブラウザ側 UI 変更を伴い、「認証時に待ち時間を挿入する」より実装負荷が高い。
FAQ
Q: アカウントロックと待ち時間挿入はどう使い分けますか?
A: ロックは攻撃抑止効果が高い一方、解除手続きが必要で運用コストが上がります。待ち時間挿入はサービス停止リスクを抑えつつ攻撃速度を落とせるため、SaaS など24時間稼働サービスで好まれます。
A: ロックは攻撃抑止効果が高い一方、解除手続きが必要で運用コストが上がります。待ち時間挿入はサービス停止リスクを抑えつつ攻撃速度を落とせるため、SaaS など24時間稼働サービスで好まれます。
Q: 待ち時間は固定長と指数バックオフのどちらが効果的ですか?
A: 固定でも一定の抑止効果がありますが、指数バックオフにすると試行回数が増えるほど急激に遅延が延びるため、より効果的です。
A: 固定でも一定の抑止効果がありますが、指数バックオフにすると試行回数が増えるほど急激に遅延が延びるため、より効果的です。
Q: 認証APIを外部公開する場合も同じ対策で十分ですか?
A: API では短時間に大量リクエストが送られやすいので、待ち時間挿入に加え、IP ブロック・レートリミットなど多層防御を推奨します。
A: API では短時間に大量リクエストが送られやすいので、待ち時間挿入に加え、IP ブロック・レートリミットなど多層防御を推奨します。
関連キーワード: ブルートフォース攻撃、ログイン遅延、アカウントロック、パスワードポリシー、レートリミット
設問2:〔セキュリティ仕様の決定〕について(1)〜(4)に答えよ。
(2)表5中のeに入れる適切なリスクNo.を一つ答えよ。
模範解答
e:2
解説
解答の論理構成
- 表5の該当箇所
- 「Web画面入出力」の仕様には
「Web画面からの入力については、全て値チェックを行う。」
「Web画面の出力時には、エスケープ処理を行う。」
とあります。これは入力値検証や出力エスケープにより XSS・SQL インジェクションなど “Webアプリケーションの脆弱性” を防ぐための対策です。
- 「Web画面入出力」の仕様には
- 表4で “Webアプリケーションの脆弱性” が原因となっているリスク No. を探すと、次が該当します。
- 「2 インターネット経由のHSSへの不正アクセス/Webアプリケーションのセキュリティホール」
- 他のリスク No. と照合
- No.1・4・7・8 は認証やアクセス権管理に関する脆弱性。
- No.3 は「Webサーバ基盤のセキュリティホール」。
- 従って、入力値チェックとエスケープ処理で直接対応するのは「Webアプリケーションのセキュリティホール」を示す「2」のみです。
- 以上より、e には「2」を入れるのが妥当です。
誤りやすいポイント
- 「インターネット経由のHSSへの不正アクセス」という脅威名だけを見てリスク No.1 を選んでしまう。No.1 の脆弱性は b(認証・アクセス制御系)であり、入力値チェックとは対応がずれます。
- 「Webサーバ基盤のセキュリティホール」である No.3 を選択してしまう。表5が対処するのは“アプリケーション層”の脆弱性であり、基盤層とは別です。
- XSS=情報漏えいと短絡し、深刻度の高い番号を機械的に選ぶミス。対策対象の“原因”を読むことが大切です。
FAQ
Q: No.4「脆弱な認証とアクセス権管理の仕組み」も入力値チェックで防げるのでは?
A: 認証・権限管理は ID・パスワード、ロール設定などロジック側で制御します。入力値チェックやエスケープは主にコードインジェクション系の脆弱性対策であり、直接の対応関係はありません。
A: 認証・権限管理は ID・パスワード、ロール設定などロジック側で制御します。入力値チェックやエスケープは主にコードインジェクション系の脆弱性対策であり、直接の対応関係はありません。
Q: Webアプリケーションファイアウォール(WAF)があれば入力値チェックは不要ですか?
A: WAF は外部防御、入力値チェックはアプリ内部の防御です。多層防御の考え方から両方実装するのが原則です。
A: WAF は外部防御、入力値チェックはアプリ内部の防御です。多層防御の考え方から両方実装するのが原則です。
Q: 出力時エスケープだけで SQL インジェクションは防げますか?
A: いいえ。SQL インジェクション対策はプリペアドステートメントなど“入力側”での対策が基本です。出力エスケープは XSS 対策です。
A: いいえ。SQL インジェクション対策はプリペアドステートメントなど“入力側”での対策が基本です。出力エスケープは XSS 対策です。
関連キーワード: 入力値検証、エスケープ処理、セキュリティホール、多層防御、Webアプリケーション
設問2:〔セキュリティ仕様の決定〕について(1)〜(4)に答えよ。
(3)表6中のfに入れる適切なリスクNo.を二つ答えよ。
模範解答
f:2, 3
解説
解答の論理構成
-
対象箇所の把握
表6の該当行は
「インターネットからのアクセスを受け付ける回線」に対し、 ・「ファイアウォールを設置し、最小限のアクセスだけを許可する。」
・「IPSを設置し、不正アクセスの検出と、自動遮断を行う。」
・「Webアプリケーションファイアウォールを設置し、不正なHTTPアクセスを遮断する。」
と記載されています。 -
防御対象となる脅威の特定
これら 3 つの対策はいずれも“インターネット越しに届く攻撃パケット”を遮断・検知する仕組みです。
表4でインターネット経由の技術的攻撃に該当するリスクは次の 2 つです。
• リスク No.「2」:脆弱性「Webアプリケーションのセキュリティホール」
• リスク No.「3」:脆弱性「Webサーバ基盤のセキュリティホール」 -
リスク―対策の対応付け
・「Webアプリケーションファイアウォール」は不正な HTTP リクエストを遮断し、リスク No.「2」に直接対応します。
・「ファイアウォール」および「IPS」は OS や Web サーバに対する攻撃コードをブロックし、リスク No.「3」に直接対応します。 -
他候補の除外理由
リスク No.「1」は脆弱性が「b」となっており、後段の表5でパスワード強化やアカウントロックなど“認証強化”で対処しているため、本行のネットワーク機器ではなく表5側でカバーされています。したがって f には含めません。 -
結論
よって f に入るリスク No. は「2, 3」となります。
誤りやすいポイント
- 「ファイアウォール=何でも防げる」と考え、リスク No.「1」も含めてしまう。実際は認証強化で対処するリスクのため別行で管理されている。
- 「IPS=侵入後検知」と誤解し、Webアプリケーションの脆弱性専用と判断してしまう。本問では OS/Web サーバ層の攻撃を想定している。
- 対策とリスクを“脅威”で合わせようとしてミスをする。リスク管理では“脆弱性”との対応関係でマッピングする方が確実。
FAQ
Q: リスク No.「1」は「インターネット経由のHSSへの不正アクセス」なので、ネットワーク機器で防ぐのでは?
A: リスク No.「1」の脆弱性は「b」であり、表5の「顧客の認証」「権限管理」で直接対処しています。設問の行は“回線レベルの通信制御”を対象としているため含めません。
A: リスク No.「1」の脆弱性は「b」であり、表5の「顧客の認証」「権限管理」で直接対処しています。設問の行は“回線レベルの通信制御”を対象としているため含めません。
Q: 「IPS」と「Webアプリケーションファイアウォール」はどちらも攻撃を遮断しますが、違いは?
A: 「IPS」はパケットレベルでシグネチャやアノマリによる検知・遮断を行い OS/ミドルウェア攻撃にも対応します。一方「Webアプリケーションファイアウォール」は HTTP レイヤでリクエスト内容を解析し、SQL インジェクションなどアプリケーション層攻撃を専用に防ぎます。
A: 「IPS」はパケットレベルでシグネチャやアノマリによる検知・遮断を行い OS/ミドルウェア攻撃にも対応します。一方「Webアプリケーションファイアウォール」は HTTP レイヤでリクエスト内容を解析し、SQL インジェクションなどアプリケーション層攻撃を専用に防ぎます。
Q: “最小限のアクセスだけを許可”とは具体的に何を指す?
A: 一般に 80/TCP や 443/TCP など HSS 提供に必要なポートのみを開放し、それ以外のポート・IP をファイアウォールで閉じることを意味します。
A: 一般に 80/TCP や 443/TCP など HSS 提供に必要なポートのみを開放し、それ以外のポート・IP をファイアウォールで閉じることを意味します。
関連キーワード: ファイアウォール、IPS, WAF, セキュリティホール、パケットフィルタ링
設問2:〔セキュリティ仕様の決定〕について(1)〜(4)に答えよ。
(4)表6中のgに入れる適切な字句を40字以内で述べよ。
模範解答
g:セキュリティ修正プログラムが公表されたら速やかに適用する。
解説
解答の論理構成
- 【問題文】の「表 4 顧客データに対するリスク分析の結果(抜粋)」で、リスク No.3 の脅威は
――「Webサーバ基盤のセキュリティホール」――
と明記されています。 - 同じく【問題文】の「表6 HSSの運用管理に関する要件(抜粋)」には、
――「インターネットからのアクセスを受け付けるWebサーバ」――
の欄に要件として「・g」が空欄で示され、右端の列にはリスク No.3 が対応付けられています。 - リスク No.3 の脅威「Webサーバ基盤のセキュリティホール」を低減する典型的な管理策は「セキュリティ修正プログラム(パッチ)の迅速な適用」です。
- したがって、空欄gには、パッチマネジメントを示す具体策を記述すれば、リスク低減策とリスクの対応付けが一貫します。
以上より
【解答】セキュリティ修正プログラムが公表されたら速やかに適用する。
【解答】セキュリティ修正プログラムが公表されたら速やかに適用する。
誤りやすいポイント
- 「ウイルス対策ソフトを導入する」と勘違いする。リスク No.3 は Web サーバ基盤そのものの脆弱性であり、マルウェア対策とは主眼が異なります。
- 「定期的に OS を再起動する」「アクセスログを監視する」などを挙げるケース。どちらも重要ですが、脅威「Webサーバ基盤のセキュリティホール」の主因(未適用パッチ)を直接低減していません。
- ファイアウォールや IPS で外部攻撃を防ぐ施策を書いてしまう。これらは同じ表の上段(回線側)の要件で既に列挙されており、重複になります。
FAQ
Q: 「速やかに」の目安はどのくらいですか?
A: 一般にはパッチ公開後、影響評価を行った上で数日以内に適用する運用を指します。本試験では具体的日数を示す必要はありません。
A: 一般にはパッチ公開後、影響評価を行った上で数日以内に適用する運用を指します。本試験では具体的日数を示す必要はありません。
Q: 自動更新機能を有効にするだけでは不十分ですか?
A: 自動更新は有効ですが、運用要件としては「公表されたら速やかに適用する」と書くことで、人手による検証と確実な適用を含意できます。
A: 自動更新は有効ですが、運用要件としては「公表されたら速やかに適用する」と書くことで、人手による検証と確実な適用を含意できます。
Q: Web アプリケーションファイアウォール(WAF)は脆弱性対策になりませんか?
A: WAF は攻撃検知・遮断の追加防御ですが、基盤ソフトウェア自体の脆弱性を除去するわけではありません。そのためパッチ適用が第一の対策になります。
A: WAF は攻撃検知・遮断の追加防御ですが、基盤ソフトウェア自体の脆弱性を除去するわけではありません。そのためパッチ適用が第一の対策になります。
関連キーワード: パッチマネジメント、脆弱性管理、リスク対策、Webサーバ、セキュリティホール
設問3:予約管理機能の不具合について、(1)〜(4)に答えよ。
(1)表7を完成させるために、h〜lに入れる適切な字句又は数字を答えよ。
模範解答
h:42
i:α
j:60
k:β
l:60
解説
解答の論理構成
- 【問題文】の「顧客αと顧客βが、画面2で空き状態であった同一の予約枠をほぼ同時に選択した場合、表7に示す順序で各処理が完了すると、顧客αの仮予約がデータベースに反映されない」とあるように、表7は“競合状態”の発生手順を示しています。
- まず顧客αが psSel.executeQuery() を実行して予約枠を読み取ります。これは【図5】の「42行目」に該当し、表7の順序1に指定済みです。
- 次に顧客βも同じ空き枠を読み取る必要があります。βが実行する処理も psSel.executeQuery() であり、行番号は同じく【図5】の「42行目」です。したがって
h:42 - その後、αが先に psUp.executeUpdate()(仮予約更新)を行います。executeUpdate は【図5】の「60行目」に位置しています。対象顧客はαなので
i:α j:60 - 最後にβも psUp.executeUpdate() を行い、βの仮予約情報で上書きされるためαの予約が失われます。βが実行する行番号も「60行目」です。よって
k:β l:60
以上から、h〜l には次のとおり値が入ります。
h:42 i:α j:60 k:β l:60
h:42 i:α j:60 k:β l:60
誤りやすいポイント
- 42行目と60行目の役割を混同し、SELECT と UPDATE を逆に割り当ててしまう。
- 「αとβのどちらが先にUPDATEするか」で結果が変わることに気づかず、順序3と順序4の顧客を逆に書いてしまう。
- 「同じSQLを実行=行番号も同じ」と気づかず、βのSELECT行を別番号にしてしまう。
FAQ
Q: 42行目と60行目の処理は具体的に何をしているのですか?
A: 42行目は psSel.executeQuery() により rsvList テーブルから対象予約枠を読み取ります。60行目は psUp.executeUpdate() により読み取った枠を仮予約状態に更新します。
A: 42行目は psSel.executeQuery() により rsvList テーブルから対象予約枠を読み取ります。60行目は psUp.executeUpdate() により読み取った枠を仮予約状態に更新します。
Q: 競合状態を防ぐ簡単な方法はありますか?
A: データベース側で行ロックを掛ける、WHERE 句に状態や顧客IDを加えて影響行数(戻り値)をチェックする、アプリケーション側でトランザクション境界を明示するなどが考えられます。図9は戻り値確認で競合を検知する修正例です。
A: データベース側で行ロックを掛ける、WHERE 句に状態や顧客IDを加えて影響行数(戻り値)をチェックする、アプリケーション側でトランザクション境界を明示するなどが考えられます。図9は戻り値確認で競合を検知する修正例です。
Q: なぜαの仮予約だけが失われるのですか?
A: αが先にUPDATEしても、そのすぐ後にβが同じ行をUPDATEすると最終的にβのデータで上書きされます。結果としてデータベースにはβの仮予約だけが残り、αの操作は無効になります。
A: αが先にUPDATEしても、そのすぐ後にβが同じ行をUPDATEすると最終的にβのデータで上書きされます。結果としてデータベースにはβの仮予約だけが残り、αの操作は無効になります。
関連キーワード: 排他制御、競合状態、トランザクション、行ロック、更新競合
設問3:予約管理機能の不具合について、(1)〜(4)に答えよ。
(2)表8を完成させるために、m〜rに入れる適切な数字を答えよ。
模範解答
m:5
n:42
o:6
p:55
q:5
r:60
解説
解答の論理構成
-
まず、表8の「対象の顧客 β」が実行している処理は、画面2で予約枠をクリックしたときに呼び出されるサーブレット “WakuClick” であることが【問題文】
「○を選択すると、サーブレット“WakuClick”が呼び出される。」
から分かります。したがって図番号は「図5」と決定できます。 -
“WakuClick” 内で予約枠の現在状態を調べる最初の SQL は【図5】
42行目 ResultSet rs = psSel.executeQuery();
です。従って
m:5、n:42 -
αが本予約を確定する処理は、画面3で “予約する” ボタンを押したときに呼び出されるサーブレット “KakuteiClick” で行われます(【問題文】「サーブレット“KakuteiClick”が呼び出される」)。
本予約へ更新する SQL は【図6】
55行目 psUp.executeUpdate();
なので
o:6、p:55 -
βが仮予約に書き換える UPDATE は “WakuClick” の 60 行目【図5】
psUp.executeUpdate();
で実行されるため
q:5、r:60 -
以上より、表8の空欄を埋めると
m:5、n:42、o:6、p:55、q:5、r:60
となります。
誤りやすいポイント
- “WakuClick” と “KakuteiClick” の役割を取り違え、図番号を入れ替えてしまう。
- UPDATE を実行している行を executeQuery と勘違いし、行番号を 42 ↔ 60 で誤答する。
- 並行処理の時系列を追わずに「SELECT→UPDATE→SELECT」の順序を理解せず、どの顧客がどの処理を行ったかを混同する。
FAQ
Q: 行番号はどのように特定すれば良いですか?
A: まず対象の処理が呼び出すサーブレットを特定し、該当図を決めます。次に、該当サーブレットの中で「SELECT」「UPDATE」など問題文が求める処理が書かれている行を確認します。行番号は図に付与されている数字をそのまま引用してください。
A: まず対象の処理が呼び出すサーブレットを特定し、該当図を決めます。次に、該当サーブレットの中で「SELECT」「UPDATE」など問題文が求める処理が書かれている行を確認します。行番号は図に付与されている数字をそのまま引用してください。
Q: なぜ β の UPDATE(図5の60行目)が α の確定後に実行できるのですか?
A: β は Step3 で既に ResultSet を取得しており、その後ローカル変数 rsvStatus を条件判定に使います。α が Step4 で予約状態を“2(予約済)”にしても、β は取得済みの rsvStatus を変更しないまま 60 行目を実行するため、競合が発生します。
A: β は Step3 で既に ResultSet を取得しており、その後ローカル変数 rsvStatus を条件判定に使います。α が Step4 で予約状態を“2(予約済)”にしても、β は取得済みの rsvStatus を変更しないまま 60 行目を実行するため、競合が発生します。
Q: 修正後のプログラム(図9)ではこの競合はどう防いでいますか?
A: WHERE 句に CustID=? AND Status=? を追加し、executeUpdate() の戻り値が 0 行なら失敗と判定しています。これにより α が確定して行が更新済みの場合は β の UPDATE が 0 行となり、処理を打ち切れるようになっています。
A: WHERE 句に CustID=? AND Status=? を追加し、executeUpdate() の戻り値が 0 行なら失敗と判定しています。これにより α が確定して行が更新済みの場合は β の UPDATE が 0 行となり、処理を打ち切れるようになっています。
関連キーワード: 同期制御、悲観的ロック、コンカレンシ制御、楽観的ロック、トランザクション
設問3:予約管理機能の不具合について、(1)〜(4)に答えよ。
(3)図9を完成させるために、s〜uに入れる適切な文字列を答えよ。
模範解答
以下のいずれか1組をすべて正しく記載すれば正解とする(混在は不可)。
・パターンA
s:Status=?
t:psUp.setInt(10, rsvStatus)
u:1
・パターンB
s:LastUpdate=?
t:psUp.setLong(10, lastDateTime)
u:1
解説
解答の論理構成
-
更新対象行を特定する追加条件
- 図9の25行目では、従来の WHERE rsvDate=? AND rsvTime=? AND Biyoshi=? AND CustID=? AND s という形で 4 つの主キー相当列に加えて s が必要です。
- 42行目で読み込んだ直後の行状態を 52~58 行目で再度 UPDATE するため、読み込み時と同じ値が残っていることを確認する 楽観的ロックが目的です。
- 楽観的ロックに使える列は、読み込み時点で値が分かっており、その後の並行トランザクションが変更する可能性がある列です。図5の48行目では rsvStatus、44行目では lastDateTime を取得しています。
-
具体的な 2 つのロック方法
① 状態列ロック- s に Status=? を置き、54 行目以前に psUp.setInt(10, rsvStatus)(t)で 読み込み時の状態を埋め込む。
- これにより、他の取引で Status が変更されていた場合 executeUpdate の戻り値は 0 行となり、59 行目の比較で失敗扱いになります。
② タイムスタンプロック- s に LastUpdate=? を置き、58 行目の直後で psUp.setLong(10, lastDateTime)(t)を設定します。
- LastUpdate は図8「ある行のいずれかの列に更新があった場合、その時刻をLastUpdateに設定する。」とあるとおり確実に変わるため衝突検知が可能です。
-
更新件数判定
- executeUpdate の戻り値は「更新した行数」です(問題文記載)。
- 衝突がなければ 1 行更新されるので u には 1 を置きます。
- 0 行であれば他トランザクションと衝突しており、62~63 行目の予約失敗画面へ遷移します。
-
結論
上記 2 通りの実装いずれも要件を満たすため、模範解答は- パターンA:
- s:Status=?
- t:psUp.setInt(10, rsvStatus)
- u:1
- パターンB:
- s:LastUpdate=?
- t:psUp.setLong(10, lastDateTime)
- u:1
- パターンA:
誤りやすいポイント
- CustID だけでは他ユーザとの衝突を検知できても、同一ユーザの二重操作を防げないことに気付きにくい。
- executeUpdate の戻り値を boolean だと勘違いし、== true などで比較してしまう。
- タイムスタンプ列を使う場合、LastUpdate を SET 句で上書きしているため WHERE 句にも同値を入れなければ意味がないことを忘れやすい。
FAQ
Q: どうして排他ロックではなく楽観的ロックを採用しているのですか?
A: 予約枠のクリックは短時間で完了し、長時間ロックを保持するとスケールしません。UPDATE 時に行数を確認する楽観的ロックなら、スループットを落とさずに衝突だけ検知できます。
A: 予約枠のクリックは短時間で完了し、長時間ロックを保持するとスケールしません。UPDATE 時に行数を確認する楽観的ロックなら、スループットを落とさずに衝突だけ検知できます。
Q: Status と LastUpdate のどちらを使う方が安全ですか?
A: LastUpdate は列更新が発生するたび必ず変わるため衝突検知精度が高いです。ただしミリ秒単位で同時更新が起こる DB では値が一致する可能性もわずかにあります。実装難度が低いのは Status を使う方法です。
A: LastUpdate は列更新が発生するたび必ず変わるため衝突検知精度が高いです。ただしミリ秒単位で同時更新が起こる DB では値が一致する可能性もわずかにあります。実装難度が低いのは Status を使う方法です。
Q: executeUpdate()==1 ではなく >0 にするとどうなりますか?
A: 主キー条件で 1 行しかヒットしない設計なので結果は同じですが、将来複数行を対象にした SQL に変更したとき意図しない挙動になります。今回は 1 行限定の比較が安全です。
A: 主キー条件で 1 行しかヒットしない設計なので結果は同じですが、将来複数行を対象にした SQL に変更したとき意図しない挙動になります。今回は 1 行限定の比較が安全です。
関連キーワード: 楽観的ロック、同時更新制御、WHERE 句、排他制御、タイムスタンプ
設問3:予約管理機能の不具合について、(1)〜(4)に答えよ。
(4)本文中の下線①の事象をテストにおいて再現させるための方法を60字以内で具体的に述べよ。
模範解答
デバッグで、SQL文の発行直前にブレークポイントを設定して、二つの予約処理を並行して実行する。
解説
解答の論理構成
-
事象の要諦
【問題文】では下線①として
「空き状態であった予約枠を、顧客αが画面2で選択して画面3に進むのと並行して、同一の予約枠を顧客βが画面2で選択した場合…顧客βの個人情報が顧客αの画面4に表示されてしまう」
とあり、同一予約枠に対する2つのリクエストが“ほぼ同時”に発行される状況を再現する必要があります。 -
技術的背景
・顧客α側のサーブレット “WakuClick” では 60行目で psUp.executeUpdate() を実行し仮予約を記録します。
・顧客β側の同処理もほぼ同時刻で走るため、レースコンディションにより α・β の CustID が入れ替わる可能性があります。
・それを意図的に起こすには、2スレッドの処理タイミングを人為的に揃える必要があります。 -
再現手順の要点
デバッガで「SQL発行直前」に停止させ、2ブラウザから該当予約枠を操作した状態でスレッドを交互に再開すれば、【問題文】表8に示された「α 60行目 → α 42行目 → β …」という順序を擬似的に構築できます。
よって模範解答の
「デバッグで、SQL文の発行直前にブレークポイントを設定して、二つの予約処理を並行して実行する。」
が妥当となります。
誤りやすいポイント
- 手動クリックを高速に繰り返すだけではタイミングが一定せず、表8の順序を再現しにくいです。
- ネットワーク遅延を人工的に挿入しても JDBC 実行直前のスレッド制御まではできません。
- ブレークポイントを psUp.executeUpdate() ではなく psSel.executeQuery() に置くと、後続ロジックがずれ再現に失敗します。
FAQ
Q: 手元に2台 PC がなくても再現できますか?
A: 1台 PC にブラウザを2つ立ち上げるか、開発環境の「並列リクエスト送信機能」を使えば十分です。
A: 1台 PC にブラウザを2つ立ち上げるか、開発環境の「並列リクエスト送信機能」を使えば十分です。
Q: ブレークポイントを置く具体的な行は?
A: “WakuClick” 60行目と “KakuteiClick” 55行目(仮予約確定時)に置くと表8の順序を作りやすいです。
A: “WakuClick” 60行目と “KakuteiClick” 55行目(仮予約確定時)に置くと表8の順序を作りやすいです。
Q: なぜ SQL 直前なのですか?
A: JDBC ドライバが SQL を発行した瞬間に予約表が更新されるため、そこ以降はアプリ側で状態を巻き戻せません。
A: JDBC ドライバが SQL を発行した瞬間に予約表が更新されるため、そこ以降はアプリ側で状態を巻き戻せません。
関連キーワード: レースコンディション、同期制御、ブレークポイント、並行処理、SQL実行
設問4:
今回のような予約管理機能の不具合を未然に防止するためには、データベースを利用したWebアプリケーションの開発における規約が必要である。特に、データベースから読み込んだデータの更新処理に必要な規約について、Webアプリケーションの特性を考慮した上で、80字以内で述べよ。
模範解答
データベースから読み込んだデータを更新する際に、そのデータが他のスレッドによって変更されていないことを確認する。
解説
解答の論理構成
- 予約枠の同時選択で発生した不具合は、表7の「顧客αの仮予約がデータベースに反映されない」や表8の「顧客βの個人情報が顧客αの画面4に表示」など、読込後に別スレッドが同一行を変更したことが原因です。
- これを受けT主任は、図9 25行目でUPDATE文の WHERE 句に「CustID=?」などの読込時点の値を追加し、さらに図9 59行目で「psUp.executeUpdate() の戻り値」をチェックして更新競合を検知する楽観ロック方式を導入しました。
- 上記対策が成り立つための開発規約は「読込時点の元データが他スレッドで変更されていないことを、更新時に必ず検証し、差分があれば処理を中断する」と要約できます。
- よって模範解答の「データベースから読み込んだデータを更新する際に、そのデータが他のスレッドによって変更されていないことを確認する。」が適切となります。
誤りやすいポイント
- 「トランザクションを使えば十分」と考え、行レベルロックで長時間の占有を許してしまう。
- SELECT ... FOR UPDATE を安易に用いてスケーラビリティを下げる。
- executeUpdate の戻り値を確認せずに「更新成功」と判断し、競合を見逃す。
- WHERE句に主キーだけを指定し、読込時点の列値(状態コードなど)を条件に含めない。
FAQ
Q: 行ロックを掛ければ規約は不要ですか?
A: Webアプリケーションは画面間で接続が切れるため長時間ロックが残りやすく、性能劣化やデッドロックを招くので規約による楽観ロックの方が現実的です。
A: Webアプリケーションは画面間で接続が切れるため長時間ロックが残りやすく、性能劣化やデッドロックを招くので規約による楽観ロックの方が現実的です。
Q: 戻り値が 0 のときにどう処理すれば良いでしょうか?
A: 「他ユーザが先に更新した」と判断し、再読込して結果を表示するか、エラーメッセージで再実行を促すなどユーザビリティを考慮した実装が必要です。
A: 「他ユーザが先に更新した」と判断し、再読込して結果を表示するか、エラーメッセージで再実行を促すなどユーザビリティを考慮した実装が必要です。
Q: 楽観ロックに必要なカラムは何を選べば良いですか?
A: 状態を表す列(本問では Status と CustID など)か、汎用的に LastUpdate のタイムスタンプを使う方法が一般的です。
A: 状態を表す列(本問では Status と CustID など)か、汎用的に LastUpdate のタイムスタンプを使う方法が一般的です。
関連キーワード: 楽観ロック、排他制御、更新競合、行更新数チェック、WHERE句条件


