「資格試験/情報処理技術者試験/情報セキュリティスペシャリスト/過去問2013年春午後2/問1設問3-2」の編集履歴(バックアップ)一覧に戻る

資格試験/情報処理技術者試験/情報セキュリティスペシャリスト/過去問2013年春午後2/問1設問3-2 - (2013/09/01 (日) 16:52:17) の編集履歴(バックアップ)


設問3 予約管理機能の不具合について(1)~(4)に答えよ。

(2) 表8を完成させるために、【m】~【r】に入れる適切な字句又は数字を答えよ。
【m】:5
【n】:42
【o】:6
【p】:55
【q】:5
【r】:60

解説

設問2につづいて、レースコンディションの穴埋め問題です。
本文抜粋
 更に、①空き状態であった予約枠を、顧客αが画面2で選択して画面3に進むのと並行して、同一の予約枠を顧客βが画面2で選択した場合、表8に示す順序で各処理が完了すると、顧客βの個人情報が顧客αの画面4に表示されてしまうことが確認できた。
 ちょうど下線①の部分がポイントです。設問2はレースコンディションの結果先に仮予約した人の情報が、後から仮予約した人の情報で上書きされてしまいましたが。今回は、「後から更新した人の情報が、先に更新した人の画面に表示される」という現象です。

問題のソース

図6 サーブレット"KakuteiClick"

(管理人省略)
48:        // 予約状況が仮であり、自分の予約であることを確認する
49:        if (rsvStatus == RSV_KARI && rsvUserID.equals(loginUserID)) {
50:            // 予約状況を予約確定に変更する
51:            psUp.setInt(1, RSV_KARI); psUp.setString(2, loginUserID);
52:            psUp.setString(3, toShop); psUp.setString(4, serviceMenu);
53:            psUp.setLong(5, nowDateTime); psUp.setString(6, rsvDate);
54:            psUp.setString(7, rsvTime); psUp.setString(8, rsvBiyoshi);
55:            psUp.executeUpdate(); ← [ポイント1.予約確定に更新]
56:            psSel.setString(1, rsvDate); psSel.setString(2, rsvTime);
57:            psSetl.setString(3, rsvBiyoshi);
58:            rs = psSel.executeQuery(); ← [ポイント2.更新:結果を読み込んで画面に表示]
59:            (省略)[rs内のデータを基にして図4の画面4(予約確定)のHTML出力を行う]
60:        } else {
(管理人省略)

 αのトランザクションが[ポイント1.予約確定に更新]で更新してから、[ポイント2.更新:結果を読み込んで画面に表示]でデータを読み込んで画面に表示している…この間にβのトランザクションが更新したら、「αの画面にβの情報が表示される」という現象が発生します。
順序 対象の顧客 処理 備考
1 α 図6の55行目 [ポイント1.予約確定に更新]
3 β 図6の?行目
2 α 図6の58行目 [ポイント2.更新:結果を読み込んで画面に表示]



表8 個人情報の漏えいにつながる処理の順序

順序 対象の顧客 処理 備考
1 α 図5の60行目
2 α 図6の42行目 順序1の処理が完了し、10分以上経過してから実行される。
3 β 図【m】の【n】行目
4 α 図【o】の【p】行目
5 β 図【q】の【r】行目
6 α 図6の58行目