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

資格試験/情報処理技術者試験/情報セキュリティスペシャリスト/過去問2013年春午後2/問1設問3-2」(2013/09/01 (日) 20:56:06) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

* 設問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:&nbsp(4)&nbsp(4) // 予約状況が仮であり、自分の予約であることを確認する 49:&nbsp(4)&nbsp(4) if (rsvStatus == RSV_KARI && rsvUserID.equals(loginUserID)) { 50:&nbsp(4)&nbsp(4)&nbsp(4) // 予約状況を予約確定に変更する 51:&nbsp(4)&nbsp(4)&nbsp(4) psUp.setInt(1, RSV_KARI); psUp.setString(2, loginUserID); 52:&nbsp(4)&nbsp(4)&nbsp(4) psUp.setString(3, toShop); psUp.setString(4, serviceMenu); 53:&nbsp(4)&nbsp(4)&nbsp(4) psUp.setLong(5, nowDateTime); psUp.setString(6, rsvDate); 54:&nbsp(4)&nbsp(4)&nbsp(4) psUp.setString(7, rsvTime); psUp.setString(8, rsvBiyoshi); 55:&nbsp(4)&nbsp(4)&nbsp(4) psUp.executeUpdate();&bold(){&color(red){ ← [ポイント1.予約確定に更新]}} 56:&nbsp(4)&nbsp(4)&nbsp(4) psSel.setString(1, rsvDate); psSel.setString(2, rsvTime); 57:&nbsp(4)&nbsp(4)&nbsp(4) psSetl.setString(3, rsvBiyoshi); 58:&nbsp(4)&nbsp(4)&nbsp(4) rs = psSel.executeQuery();&bold(){&color(red){ ← [ポイント2.更新:結果を読み込んで画面に表示]}} 59:&nbsp(4)&nbsp(4)&nbsp(4) (省略)[rs内のデータを基にして図4の画面4(予約確定)のHTML出力を行う] 60:&nbsp(4)&nbsp(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分間)を確認し、&bold(){&color(red){[有効期間を過ぎていれば、この顧客の仮予約に置き換え}}た後に、画面3が表示される。有効期間内の場合は予約失敗の画面(画面省略)が表示される。 「&bold(){&color(red){[○を選択するとサーブレット”WakuClick”が呼び出される。}}」「&bold(){&color(red){[有効期間を過ぎていれば、この顧客の仮予約に置き換え}}」とあるので、「図5の”WakuClick”で顧客βが、顧客αの仮予約を上書きした」と読めます。 ** 図5 サーブレット"WakuClick" 抜粋 #divclass(blackdiv){{ (省略) 54:&nbsp(4)&nbsp(4) // 予約状況が空きであることを確認し、仮予約処理を行う 55:&nbsp(4)&nbsp(4) if (rsvStatus == RSV_AKI) { 56:&nbsp(4)&nbsp(4)&nbsp(4) psUp.setInt(1, RSV_KARI); psUp.setString(2, loginUserID); psUp.setString(3, ""); 57:&nbsp(4)&nbsp(4)&nbsp(4) psUp.setString(4, ""); psUp.setLong(5, nowDateTime); 58:&nbsp(4)&nbsp(4)&nbsp(4) psUp.setString(6, rsvDate); 59:&nbsp(4)&nbsp(4)&nbsp(4) psUp.setString(7, rsvTime); psUp.setString(8, rsvBiyoshi); 60:&nbsp(4)&nbsp(4)&nbsp(4) psUp.executeUpdate(); &bold(){&color(red){← [仮予約に更新]} 61:&nbsp(4)&nbsp(4)&nbsp(4) (省略)[図6の処理を引き継ぐために、選択した予約枠の情報をサーブレットのセッション情報に保存する] 62:&nbsp(4)&nbsp(4)&nbsp(4) (省略)[画面3のHTML出力を行う] (省略) }} ** 図5 サーブレット"WakuClick"終わり 図5の60行目で顧客βの更新が入って、図6の58行目でそのデータを読み込み画面に表示しているのです。これを図に反映すると以下のようになります。 |順序|対象の顧客|処理|備考| |1|α|図6の55行目|ポイント1.予約確定に更新| |2|β|図5の60行目|&bold(){&color(red){1と2の間に、顧客βの仮予約で更新}}| |3|α|図6の58行目|ポイント2.更新:結果を読み込んで画面に表示| ちなみに、この図は、表8の順序456にそのまま該当するので、残るは順序3の処理だけです。 ** 表8 個人情報の漏えいにつながる処理の順序 |順序|対象の顧客|処理|備考| |1|α|図5の60行目|| |2|α|図6の42行目|順序1の処理が完了し、10分以上経過してから実行される。| |3|β|図【m】の【n】行目|| |4|α|図&bold(){&color(red){6}}の&bold(){&color(red){55}}行目|| |5|β|図&bold(){&color(red){5}}の&bold(){&color(red){60}}行目|| |6|α|図&bold(){&color(red){6}}の&bold(){&color(red){58}}行目|| 順序3は順序5が図5であることと、ここに登場する順序nは全てデータベースからの読み込みか書き込みであることから、同じ順序5のデータベース読み込み箇所を上げればよいと判断できます。 ** 図5 サーブレット"WakuClick" 抜粋 #divclass(blackdiv){{ (省略) 37:&nbsp(4)&nbsp(4) (省略)[前出の四つの変数の入力値チェックを行う] 38:&nbsp(4)&nbsp(4) (省略)[入力値チェックで問題があったら、エラーのHTML出力を行って終了する] 39: 40:&nbsp(4)&nbsp(4) // 選択された予約枠の予約状況を参照する 41:&nbsp(4)&nbsp(4) psSel.setString(1, rsvDate); psSel.setString(2, rsvTime); psSetl.setString(3, rsvBiyoshi); 42:&nbsp(4)&nbsp(4) ResultSet rs = psSel.executeQuery(); &bold(){&color(red){← [有効期限切れの枠を、仮予約に更新]} 43:&nbsp(4)&nbsp(4) rs.next(); 44:&nbsp(4)&nbsp(4) long lastDateTime = rs.getLong("LastUpdate"); (省略) }} ** 図5 サーブレット"WakuClick"終わり  上記の通り、図5サーブレット"WakuClikc"の中でデータを読み込んでいる箇所は42行のみなので、順序3には図5の42行目で表8は完成します。 ** 表8 個人情報の漏えいにつながる処理の順序 |順序|対象の顧客|処理|備考| |1|α|図5の60行目|| |2|α|図6の42行目|順序1の処理が完了し、10分以上経過してから実行される。| |3|β|図&bold(){&color(red){5}}の&bold(){&color(red){42}}行目|| |4|α|図&bold(){&color(red){6}}の&bold(){&color(red){55}}行目|| |5|β|図&bold(){&color(red){5}}の&bold(){&color(red){60}}行目|| |6|α|図&bold(){&color(red){6}}の&bold(){&color(red){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:&nbsp(4)&nbsp(4) // 予約状況が仮であり、自分の予約であることを確認する 49:&nbsp(4)&nbsp(4) if (rsvStatus == RSV_KARI && rsvUserID.equals(loginUserID)) { 50:&nbsp(4)&nbsp(4)&nbsp(4) // 予約状況を予約確定に変更する 51:&nbsp(4)&nbsp(4)&nbsp(4) psUp.setInt(1, RSV_KARI); psUp.setString(2, loginUserID); 52:&nbsp(4)&nbsp(4)&nbsp(4) psUp.setString(3, toShop); psUp.setString(4, serviceMenu); 53:&nbsp(4)&nbsp(4)&nbsp(4) psUp.setLong(5, nowDateTime); psUp.setString(6, rsvDate); 54:&nbsp(4)&nbsp(4)&nbsp(4) psUp.setString(7, rsvTime); psUp.setString(8, rsvBiyoshi); 55:&nbsp(4)&nbsp(4)&nbsp(4) psUp.executeUpdate();&bold(){&color(red){ ← [ポイント1.予約確定に更新]}} 56:&nbsp(4)&nbsp(4)&nbsp(4) psSel.setString(1, rsvDate); psSel.setString(2, rsvTime); 57:&nbsp(4)&nbsp(4)&nbsp(4) psSetl.setString(3, rsvBiyoshi); 58:&nbsp(4)&nbsp(4)&nbsp(4) rs = psSel.executeQuery();&bold(){&color(red){ ← [ポイント2.更新:結果を読み込んで画面に表示]}} 59:&nbsp(4)&nbsp(4)&nbsp(4) (省略)[rs内のデータを基にして図4の画面4(予約確定)のHTML出力を行う] 60:&nbsp(4)&nbsp(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分間)を確認し、&bold(){&color(red){[有効期間を過ぎていれば、この顧客の仮予約に置き換え}}た後に、画面3が表示される。有効期間内の場合は予約失敗の画面(画面省略)が表示される。 「&bold(){&color(red){[○を選択するとサーブレット”WakuClick”が呼び出される。}}」「&bold(){&color(red){[有効期間を過ぎていれば、この顧客の仮予約に置き換え}}」とあるので、「図5の”WakuClick”で顧客βが、顧客αの仮予約を上書きした」と読めます。 ** 図5 サーブレット"WakuClick" 抜粋 #divclass(blackdiv){{ (省略) 54:&nbsp(4)&nbsp(4) // 予約状況が空きであることを確認し、仮予約処理を行う 55:&nbsp(4)&nbsp(4) if (rsvStatus == RSV_AKI) { 56:&nbsp(4)&nbsp(4)&nbsp(4) psUp.setInt(1, RSV_KARI); psUp.setString(2, loginUserID); psUp.setString(3, ""); 57:&nbsp(4)&nbsp(4)&nbsp(4) psUp.setString(4, ""); psUp.setLong(5, nowDateTime); 58:&nbsp(4)&nbsp(4)&nbsp(4) psUp.setString(6, rsvDate); 59:&nbsp(4)&nbsp(4)&nbsp(4) psUp.setString(7, rsvTime); psUp.setString(8, rsvBiyoshi); 60:&nbsp(4)&nbsp(4)&nbsp(4) psUp.executeUpdate(); &bold(){&color(red){← [仮予約に更新]} 61:&nbsp(4)&nbsp(4)&nbsp(4) (省略)[図6の処理を引き継ぐために、選択した予約枠の情報をサーブレットのセッション情報に保存する] 62:&nbsp(4)&nbsp(4)&nbsp(4) (省略)[画面3のHTML出力を行う] (省略) }} ** 図5 サーブレット"WakuClick"終わり 図5の60行目で顧客βの更新が入って、図6の58行目でそのデータを読み込み画面に表示しているのです。これを図に反映すると以下のようになります。 |順序|対象の顧客|処理|備考| |1|α|図6の55行目|ポイント1.予約確定に更新| |2|β|図5の60行目|&bold(){&color(red){1と2の間に、顧客βの仮予約で更新}}| |3|α|図6の58行目|ポイント2.更新:結果を読み込んで画面に表示| ちなみに、この図は、表8の順序456にそのまま該当するので、残るは順序3の処理だけです。 ** 表8 個人情報の漏えいにつながる処理の順序 |順序|対象の顧客|処理|備考| |1|α|図5の60行目|| |2|α|図6の42行目|順序1の処理が完了し、10分以上経過してから実行される。| |3|β|図【m】の【n】行目|| |4|α|図&bold(){&color(red){6}}の&bold(){&color(red){55}}行目|| |5|β|図&bold(){&color(red){5}}の&bold(){&color(red){60}}行目|| |6|α|図6の58行目|| 順序3は順序5が図5であることと、ここに登場する順序nは全てデータベースからの読み込みか書き込みであることから、同じ順序5のデータベース読み込み箇所を上げればよいと判断できます。 ** 図5 サーブレット"WakuClick" 抜粋 #divclass(blackdiv){{ (省略) 37:&nbsp(4)&nbsp(4) (省略)[前出の四つの変数の入力値チェックを行う] 38:&nbsp(4)&nbsp(4) (省略)[入力値チェックで問題があったら、エラーのHTML出力を行って終了する] 39: 40:&nbsp(4)&nbsp(4) // 選択された予約枠の予約状況を参照する 41:&nbsp(4)&nbsp(4) psSel.setString(1, rsvDate); psSel.setString(2, rsvTime); psSetl.setString(3, rsvBiyoshi); 42:&nbsp(4)&nbsp(4) ResultSet rs = psSel.executeQuery(); &bold(){&color(red){← [有効期限切れの枠を、仮予約に更新]} 43:&nbsp(4)&nbsp(4) rs.next(); 44:&nbsp(4)&nbsp(4) long lastDateTime = rs.getLong("LastUpdate"); (省略) }} ** 図5 サーブレット"WakuClick"終わり  上記の通り、図5サーブレット"WakuClikc"の中でデータを読み込んでいる箇所は42行のみなので、順序3には図5の42行目で表8は完成します。 ** 表8 個人情報の漏えいにつながる処理の順序 |順序|対象の顧客|処理|備考| |1|α|図5の60行目|| |2|α|図6の42行目|順序1の処理が完了し、10分以上経過してから実行される。| |3|β|図&bold(){&color(red){5}}の&bold(){&color(red){42}}行目|| |4|α|図&bold(){&color(red){6}}の&bold(){&color(red){55}}行目|| |5|β|図&bold(){&color(red){5}}の&bold(){&color(red){60}}行目|| |6|α|図6の58行目|| [[設問に戻る>資格試験/情報処理技術者試験/情報セキュリティスペシャリスト/過去問2013年春午後2/問1#設問]]

表示オプション

横に並べて表示:
変化行の前後のみ表示: