「資格試験/情報処理技術者試験/情報セキュリティスペシャリスト/過去問2013年春午後2/問1設問3-2」の編集履歴(バックアップ)一覧はこちら
追加された行は緑色になります。
削除された行は赤色になります。
* 設問3 予約管理機能の不具合について(1)~(4)に答えよ。
(2) 表8を完成させるために、【m】~【r】に入れる適切な字句又は数字を答えよ。
>【m】:5
>【n】:42
>【o】:6
>【p】:55
>【q】:5
>【r】:60
* 解説
設問2につづいて、レースコンディションの穴埋め問題です。
本文抜粋
> 更に、&u(){①空き状態であった予約枠を、顧客αが画面2で選択して画面3に進むのと並行して、同一の予約枠を顧客βが画面2で選択した場合、表8に示す順序で各処理が完了すると、顧客βの個人情報が顧客αの画面4に表示されてしまう}ことが確認できた。
ちょうど下線①の部分がポイントです。設問2はレースコンディションの結果先に仮予約した人の情報が、後から仮予約した人の情報で上書きされてしまいましたが。今回は、「後から更新した人の情報が、先に更新した人の画面に表示される」という現象です。
表8の確認
>** 表8 個人情報の漏えいにつながる処理の順序
>|順序|対象の顧客|処理|備考|解説|
>|1|α|図5の60行目||「予約状況を確認し、仮予約を行っている」部分|
>|2|α|図6の42行目|&bold(){&color(red){順序1の処理が完了し、10分以上経過してから実行される。}}|&bold(){&color(red){仮予約を確定するためにデータを読み出す}}|
>|3|β|図【m】の【n】行目|||
>|4|α|図【o】の【p】行目|||
>|5|β|図【q】の【r】行目|||
>|6|α|図6の58行目||
順序2の備考「&bold(){&color(red){順序1の処理が完了し、10分以上経過してから実行される。}}」は画面2の説明にある以下の部分とリンクしています。
>・予約枠が仮予約状態の場合、&bold(){&color(red){仮予約の有効期間(10分間)を確認}}し、有効期間を過ぎていれば、この顧客の仮予約に置き換えた後に、画面3が表示される。有効期間内の場合は予約失敗の画面(画面省略)が表示される。
仮予約の有効期間が過ぎた
問題のソース
** 図6 サーブレット"KakuteiClick"
#divclass(blackdiv){{
(管理人省略)
48: (4) (4) // 予約状況が仮であり、自分の予約であることを確認する
49: (4) (4) if (rsvStatus == RSV_KARI && rsvUserID.equals(loginUserID)) {
50: (4) (4) (4) // 予約状況を予約確定に変更する
51: (4) (4) (4) psUp.setInt(1, RSV_KARI); psUp.setString(2, loginUserID);
52: (4) (4) (4) psUp.setString(3, toShop); psUp.setString(4, serviceMenu);
53: (4) (4) (4) psUp.setLong(5, nowDateTime); psUp.setString(6, rsvDate);
54: (4) (4) (4) psUp.setString(7, rsvTime); psUp.setString(8, rsvBiyoshi);
55: (4) (4) (4) psUp.executeUpdate();&bold(){&color(red){ ← [ポイント1.予約確定に更新]}}
56: (4) (4) (4) psSel.setString(1, rsvDate); psSel.setString(2, rsvTime);
57: (4) (4) (4) psSetl.setString(3, rsvBiyoshi);
58: (4) (4) (4) rs = psSel.executeQuery();&bold(){&color(red){ ← [ポイント2.更新:結果を読み込んで画面に表示]}}
59: (4) (4) (4) (省略)[rs内のデータを基にして図4の画面4(予約確定)のHTML出力を行う]
60: (4) (4) } else {
(管理人省略)
}}
αのトランザクションが&bold(){&color(red){[ポイント1.予約確定に更新]}}で更新してから、&bold(){&color(red){[ポイント2.更新:結果を読み込んで画面に表示]}}でデータを読み込んで画面に表示している…この間にβのトランザクションが更新したら、「αの画面にβの情報が表示される」という現象が発生します。これを図にすると以下のようになります。
|順序|対象の顧客|処理|備考|
|1|α|図6の55行目|&bold(){&color(red){[ポイント1.予約確定に更新]}}|
|2|β|図?の?行目||
|3|α|図6の58行目|&bold(){&color(red){[ポイント2.更新:結果を読み込んで画面に表示]}}|
順序2のβの更新はどこになるでしょうか?本文中の下線①に「同一の予約枠を顧客βが画面2で選択した場合」とあるので、画面2の説明を見てみましょう。
>画面2 予約状況
>(画像省略)
>・各予約枠内で、○は仮予約状態又は空き状態を、×は予約済み状態を示す。
>・&bold(){&color(red){[○を選択するとサーブレット”WakuClick”が呼び出される。}}
>・その予約枠が空き状態であれば仮予約状態とした後に、画面3が表示される。
>・予約枠が仮予約状態の場合、仮予約の有効期間(10分間)を確認し、有効期間を過ぎていれば、この顧客の仮予約に置き換えた後に、画面3が表示される。有効期間内の場合は予約失敗の画面(画面省略)が表示される。
「&bold(){&color(red){[○を選択するとサーブレット”WakuClick”が呼び出される。}}」「」とあるので、図5で
** 表8 個人情報の漏えいにつながる処理の順序
|順序|対象の顧客|処理|備考|
|1|α|図5の60行目||
|2|α|図6の42行目|順序1の処理が完了し、10分以上経過してから実行される。|
|3|β|図【m】の【n】行目||
|4|α|図【o】の【p】行目||
|5|β|図【q】の【r】行目||
|6|α|図6の58行目||
[[設問に戻る>資格試験/情報処理技術者試験/情報セキュリティスペシャリスト/過去問2013年春午後2/問1#設問]]
* 設問3 予約管理機能の不具合について(1)~(4)に答えよ。
(2) 表8を完成させるために、【m】~【r】に入れる適切な字句又は数字を答えよ。
>【m】:5
>【n】:42
>【o】:6
>【p】:55
>【q】:5
>【r】:60
* 解説
設問2につづいて、レースコンディションの穴埋め問題です。
本文抜粋
> 更に、&u(){①空き状態であった予約枠を、顧客αが画面2で選択して画面3に進むのと並行して、同一の予約枠を顧客βが画面2で選択した場合、表8に示す順序で各処理が完了すると、顧客βの個人情報が顧客αの画面4に表示されてしまう}ことが確認できた。
ちょうど下線①の部分がポイントです。設問2はレースコンディションの結果先に仮予約した人の情報が、後から仮予約した人の情報で上書きされてしまいましたが。今回は、「後から更新した人の情報が、先に更新した人の画面に表示される」という現象です。
表8の確認
>** 表8 個人情報の漏えいにつながる処理の順序
>|順序|対象の顧客|処理|備考|解説|
>|1|α|図5の60行目||「予約状況を確認し、仮予約を行っている」部分|
>|2|α|図6の42行目|&bold(){&color(red){順序1の処理が完了し、10分以上経過してから実行される。}}|仮予約を確定するためにデータを読み出す|
>|3|β|図【m】の【n】行目|||
>|4|α|図【o】の【p】行目|||
>|5|β|図【q】の【r】行目|||
>|6|α|図6の58行目||
順序2の備考「&bold(){&color(red){順序1の処理が完了し、10分以上経過してから実行される。}}」は画面2の説明にある以下の部分とリンクしています。
>・予約枠が仮予約状態の場合、&bold(){&color(red){仮予約の有効期間(10分間)を確認}}し、有効期間を過ぎていれば、この顧客の仮予約に置き換えた後に、画面3が表示される。有効期間内の場合は予約失敗の画面(画面省略)が表示される。
仮予約の有効期間が過ぎた
問題のソース
** 図6 サーブレット"KakuteiClick"
#divclass(blackdiv){{
(管理人省略)
48: (4) (4) // 予約状況が仮であり、自分の予約であることを確認する
49: (4) (4) if (rsvStatus == RSV_KARI && rsvUserID.equals(loginUserID)) {
50: (4) (4) (4) // 予約状況を予約確定に変更する
51: (4) (4) (4) psUp.setInt(1, RSV_KARI); psUp.setString(2, loginUserID);
52: (4) (4) (4) psUp.setString(3, toShop); psUp.setString(4, serviceMenu);
53: (4) (4) (4) psUp.setLong(5, nowDateTime); psUp.setString(6, rsvDate);
54: (4) (4) (4) psUp.setString(7, rsvTime); psUp.setString(8, rsvBiyoshi);
55: (4) (4) (4) psUp.executeUpdate();&bold(){&color(red){ ← [ポイント1.予約確定に更新]}}
56: (4) (4) (4) psSel.setString(1, rsvDate); psSel.setString(2, rsvTime);
57: (4) (4) (4) psSetl.setString(3, rsvBiyoshi);
58: (4) (4) (4) rs = psSel.executeQuery();&bold(){&color(red){ ← [ポイント2.更新:結果を読み込んで画面に表示]}}
59: (4) (4) (4) (省略)[rs内のデータを基にして図4の画面4(予約確定)のHTML出力を行う]
60: (4) (4) } else {
(管理人省略)
}}
αのトランザクションが&bold(){&color(red){[ポイント1.予約確定に更新]}}で更新してから、&bold(){&color(red){[ポイント2.更新:結果を読み込んで画面に表示]}}でデータを読み込んで画面に表示している…この間にβのトランザクションが更新したら、「αの画面にβの情報が表示される」という現象が発生します。これを図にすると以下のようになります。
|順序|対象の顧客|処理|備考|
|1|α|図6の55行目|&bold(){&color(red){[ポイント1.予約確定に更新]}}|
|2|β|図?の?行目||
|3|α|図6の58行目|&bold(){&color(red){[ポイント2.更新:結果を読み込んで画面に表示]}}|
順序2のβの更新はどこになるでしょうか?本文中の下線①に「同一の予約枠を顧客βが画面2で選択した場合」とあるので、画面2の説明を見てみましょう。
>画面2 予約状況
>(画像省略)
>・各予約枠内で、○は仮予約状態又は空き状態を、×は予約済み状態を示す。
>・&bold(){&color(red){[○を選択するとサーブレット”WakuClick”が呼び出される。}}
>・その予約枠が空き状態であれば仮予約状態とした後に、画面3が表示される。
>・予約枠が仮予約状態の場合、仮予約の有効期間(10分間)を確認し、有効期間を過ぎていれば、この顧客の仮予約に置き換えた後に、画面3が表示される。有効期間内の場合は予約失敗の画面(画面省略)が表示される。
「&bold(){&color(red){[○を選択するとサーブレット”WakuClick”が呼び出される。}}」「」とあるので、図5で
** 表8 個人情報の漏えいにつながる処理の順序
|順序|対象の顧客|処理|備考|
|1|α|図5の60行目||
|2|α|図6の42行目|順序1の処理が完了し、10分以上経過してから実行される。|
|3|β|図【m】の【n】行目||
|4|α|図【o】の【p】行目||
|5|β|図【q】の【r】行目||
|6|α|図6の58行目||
[[設問に戻る>資格試験/情報処理技術者試験/情報セキュリティスペシャリスト/過去問2013年春午後2/問1#設問]]