設問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はレースコンディションの結果先に仮予約した人の情報が、後から仮予約した人の情報で上書きされてしまいましたが。今回は、「後から更新した人の情報が、先に更新した人の画面に表示される」という現象です。
表8の確認
表8 個人情報の漏えいにつながる処理の順序
順序 |
対象の顧客 |
処理 |
備考 |
解説 |
1 |
α |
図5の60行目 |
|
「予約状況を確認し、仮予約を行っている」部分 |
2 |
α |
図6の42行目 |
順序1の処理が完了し、10分以上経過してから実行される。 |
仮予約を確定するためにデータを読み出す |
3 |
β |
図【m】の【n】行目 |
|
|
4 |
α |
図【o】の【p】行目 |
|
|
5 |
β |
図【q】の【r】行目 |
|
|
6 |
α |
図6の58行目 |
|
仮予約を確定にした後で、画面表示のために確定データを読み込む処理 |
順序2の備考「順序1の処理が完了し、10分以上経過してから実行される。」は画面2の説明にある以下の部分とリンクしています。
- 予約枠が仮予約状態の場合、仮予約の有効期間(10分間)を確認し、有効期間を過ぎていれば、この顧客の仮予約に置き換えた後に、画面3が表示される。有効期間内の場合は予約失敗の画面(画面省略)が表示される。
「顧客αの仮予約の有効期間が過ぎてから予約確定をしようとしている」ということを読み取らせるヒントです。「有効期間が過ぎた」ということは、「顧客αの仮予約を取り消し、顧客βの仮予約とすることができる」ことを意味しています。
問題のソース
図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.予約確定に更新] |
2 |
β |
図?の?行目 |
|
3 |
α |
図6の58行目 |
[ポイント2.更新:結果を読み込んで画面に表示] |
順序2のβの更新はどこになるでしょうか?本文中の下線①に「同一の予約枠を顧客βが画面2で選択した場合」とあるので、画面2の説明を見てみましょう。
画面2 予約状況
(画像省略)
- 各予約枠内で、○は仮予約状態又は空き状態を、×は予約済み状態を示す。
- [○を選択するとサーブレット”WakuClick”が呼び出される。
- その予約枠が空き状態であれば仮予約状態とした後に、画面3が表示される。
- 予約枠が仮予約状態の場合、仮予約の有効期間(10分間)を確認し、[有効期間を過ぎていれば、この顧客の仮予約に置き換えた後に、画面3が表示される。有効期間内の場合は予約失敗の画面(画面省略)が表示される。
「[○を選択するとサーブレット”WakuClick”が呼び出される。」「[有効期間を過ぎていれば、この顧客の仮予約に置き換え」とあるので、「図5の”WakuClick”で顧客βが、顧客αの仮予約を上書きした」と読めます。
図5 サーブレット"WakuClick" 抜粋
{{
(省略)
54: // 予約状況が空きであることを確認し、仮予約処理を行う
55: if (rsvStatus == RSV_AKI) {
56: psUp.setInt(1, RSV_KARI); psUp.setString(2, loginUserID); psUp.setString(3, "");
57: psUp.setString(4, ""); psUp.setLong(5, nowDateTime);
58: psUp.setString(6, rsvDate);
59: psUp.setString(7, rsvTime); psUp.setString(8, rsvBiyoshi);
60: psUp.executeUpdate(); {← [仮予約に更新]
61: (省略)[図6の処理を引き継ぐために、選択した予約枠の情報をサーブレットのセッション情報に保存する]
62: (省略)[画面3のHTML出力を行う]
(省略)
}}
図5 サーブレット"WakuClick"終わり
図5の60行目で顧客βの更新が入って、図6の58行目でそのデータを読み込み画面に表示しているのです。これを図に反映すると以下のようになります。
順序 |
対象の顧客 |
処理 |
備考 |
1 |
α |
図6の55行目 |
ポイント1.予約確定に更新 |
2 |
β |
図5の60行目 |
1と2の間に、顧客βの仮予約で更新 |
3 |
α |
図6の58行目 |
ポイント2.更新:結果を読み込んで画面に表示 |
ちなみに、この図は、表8の順序456にそのまま該当するので、残るは順序3の処理だけです。
表8 個人情報の漏えいにつながる処理の順序
順序 |
対象の顧客 |
処理 |
備考 |
1 |
α |
図5の60行目 |
|
2 |
α |
図6の42行目 |
順序1の処理が完了し、10分以上経過してから実行される。 |
3 |
β |
図【m】の【n】行目 |
|
4 |
α |
図6の55行目 |
|
5 |
β |
図5の60行目 |
|
6 |
α |
図6の58行目 |
|
順序3は順序5が図5であることと、ここに登場する順序nは全てデータベースからの読み込みか書き込みであることから、同じ順序5のデータベース読み込み箇所を上げればよいと判断できます。
図5 サーブレット"WakuClick" 抜粋
{{
(省略)
37: (省略)[前出の四つの変数の入力値チェックを行う]
38: (省略)[入力値チェックで問題があったら、エラーのHTML出力を行って終了する]
39:
40: // 選択された予約枠の予約状況を参照する
41: psSel.setString(1, rsvDate); psSel.setString(2, rsvTime); psSetl.setString(3, rsvBiyoshi);
42: ResultSet rs = psSel.executeQuery(); {← [有効期限切れの枠を、仮予約に更新]
43: rs.next();
44: long lastDateTime = rs.getLong("LastUpdate");
(省略)
}}
図5 サーブレット"WakuClick"終わり
上記の通り、図5サーブレット"WakuClikc"の中でデータを読み込んでいる箇所は42行のみなので、順序3には図5の42行目で表8は完成します。
表8 個人情報の漏えいにつながる処理の順序
順序 |
対象の顧客 |
処理 |
備考 |
1 |
α |
図5の60行目 |
|
2 |
α |
図6の42行目 |
順序1の処理が完了し、10分以上経過してから実行される。 |
3 |
β |
図5の42行目 |
|
4 |
α |
図6の55行目 |
|
5 |
β |
図5の60行目 |
|
6 |
α |
図6の58行目 |
|
最終更新:2013年09月01日 20:56