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

資格試験/情報処理技術者試験/情報セキュリティスペシャリスト/過去問2013年春午後2/問2 - (2013/09/08 (日) 19:34:39) の1つ前との変更点

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

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

* 問2 技術情報の管理に関する次の記述を読んで、設問1~5に答えよ。  W社は、従業員数3,000名の機械部品メーカである。東京に本社、国内8か所に営業所、関西地区1か所に工場がある。本社には、経営管理部、人事総務部、営業部及び情報システム部があり、営業部は各営業所を統括する。工場には、開発部及び製造部がある。 [特許取得の推進]  W社では、国内での特許取得を推進しており、経営管理部、開発部及び製造部は、合同で特許検討会を月1回開催している。従業員は、発明の内容及び実施計画を説明した技術報告書を特許検討会に提出する。特許検討会では、技術報告書について審議し議事録を作成する。審議の結果には、”特許庁に出願”、”ノウハウとして秘匿”及び議事録(以下、技術報告書と議事録を合わせて、検討会文書という)は、紙のほか、電子ファイルとしても30年間保管することになっている。  特許として登録された場合は、通常、出願から20年間、特許権を保持できる。しかし、特許検討会に提出された技術報告書を全て出願するわけではない。仮に出願すれば、出願の内容が、全て一定期間後に後悔されるので、特許として登録されなかった場合は、技術が流出してしまうからである。  一方、W社が特許庁に出願せずに実施した技術に関して、他社の特許が登録された場合は、損害賠償などを請求される可能性がある。  特許検討会では、”ノウハウとして秘匿”と決定した審議案件の紙の検討会文書については、先使用による通常実施権(以下、先使用権という)を確保するために、”公証人の確定日付の付与”を得ている。  特許検討会のメンバが送受信する電子メール(以下、メールという)に添付されている電子ファイルやファイルサーバに保存されている電子ファイルのような日常的にやり取りしている技術情報は、”公証人の確定日付の付与”を得ていない。  特許検討会は情報システム部に対して、次の二つの要望を出した。 >・先使用権を確保するために、検討会文書の電子ファイルは経営管理部の特許責任者の押印に相当するディジタル署名を付与し、署名日の証明機能を持たせたい。 >・従業員が送信したメールに添付された技術報告書の電子ファイルを検索できるようにしたい。 [W社の情報システム]  W社の情報システムには、インターネット接続システム、製造管理システム、業務管理システム及びPC管理システムがある。情報システムの各サーバは、導入後5年をめどに更新している。情報システムの全てのサーバは、全ての電子ファイルのウイルススキャンを1日に1回行っている。W社のネットワーク構成を図1に示す。 &ref(2013SPSCPM202_01.png)  FWでは、拒否した通信をログとして記録している。情報システムの各サーバでは、サーバへのアクセス及びプログラムの動作をログとして記録している。FW上及びサーバ上でのログの保存期間は6か月である。  外部DNSサーバは、インターネット上の時刻サーバとの間で、【 a 】を用いて時刻同期を行っている。FW及び情報システムの各サーバは、外部DNSサーバとの間で、【 a 】を用いて時刻同期を行っている。 [PCの利用状況]  W社のPCは全て会社が貸与している。各部門における、PCの貸与状況を表1に示す。 ** 表1 PCの貸与状況 |部門名|貸与状況| |経営管理部、人事総務部、営業部、情報システム部|1名につき、1台のノートPC(以下、NPCという)を貸与| |営業所|1名につき、1台のNPCを貸与| |開発部|1名につき、1台のデスクトップPC(以下、DPCという)を貸与| |製造部|5名のメンバで構成される作業グループごとに、1台の共用DPCを貸与|  W社では、全てのPCにウイルス対策ソフトを導入している。ウイルス対策ソフトは、PCの起動時及び起動後は2時間ごとにPC管理サーバからウイルス定義ファイルをダウンロードし、更新する。  PC管理サーバは、1時間ごとにプロキシサーバ経由でウイルス対策ソフトのベンダのWebサーバからウイルス定義ファイルをダウンロードし、更新する。  全てのPCは、起動時に、PC管理サーバとの間で時刻同期を行っている。  PCのIPアドレスはDPCには固定的に割り当て、NCPには、L3SWのDHCPリレーエージェント機能によって動的に割り当てている。  PCの利用者IDは、従業員ごとに割り当てている。 [W社におけるメールの利用]  従業員は、PCのメールソフトを用いて、他の従業員との間及びインターネットとの間でメールの送受信を行っている。表計算ソフトを使って作成した注文票など、第三者に秘匿したい電子ファイルを送信する場合は、暗号化した上で、メールに添付している。メールソフトの受信フォルダと送信フォルダの管理は、従業員に任されている。  W社のメールアドレスのドメイン名には、W社が取得したドメイン名(以下、W社ドメイン名という)を用いている。  情報システムのサーバのうち、メールを扱うのは、外部メールサーバ、内部メールサーバ及びWFサーバである。各サーバのメールに関する機能及び動作概要を表2に示す。 ** 表2 各サーバのメールに関する機能及び動作概要 |サーバ名|機能|動作概要| |外部メールサーバ|メール転送|SMPTを使用し、インターネットと内部メールサーバとの間でメールを転送する。| |~|送信ドメイン認証|ディジタル署名を利用する【 b 】を用いた機能及びSPF(Sender Policy Framework)検証機能によってメールの送信ドメインを認証する。| |~|迷惑メール対策|メールの転送時に迷惑メールのスキャンを行う。迷惑メール定義ファイルを迷惑メール対策ソフトのベンダのWebサーバから1時間ごとにダウンロードし、更新する。情報システム部の運用担当者は、送信者メールアドレスや受信者メールアドレスを、それぞれの拒否リストに登録できる。| |内部メールサーバ|メール転送|SMTPを使用し、外部メールサーバとの間でメールを転送する。| |~|メールボックス格納|受信者メールアドレスのドメイン名(以下、受信者ドメイン名という)がW社ドメイン名であるメールを、従業員用メールアドレスごとのメールボックスに保存する。| |~|WFサーバ及びPCからのメール送信要求受付|SMTPを使用し、WFサーバ及びPC上のメールソフトから送信されたメールを受け付ける。| |~|PCからのメール受信要求受付|POP3を使用し、PC上のメールソフトから内部メールサーバのメールボックスへのアクセスを受け付ける。PCのメールソフトの設定によって、メールの受信後に内部メールサーバのメールボックスからメールを削除する。| |~|ウイルス対策|メール転送、並びにWFサーバ及びPCからのメール送信要求受付で、ウイルススキャンを行う。プロキシサーバ経由でウイルス定義ファイルをウイルス対策ソフトのベンダのWebサーバから、15分ごとにダウンロードし、更新する。| |WFサーバ|メール送信|SMTPを使用し、内部メールサーバにメールを送信する。WFサーバでは、申請及び承認が行われたときのだけメールを従業員用メールアドレス宛に送信する。| |~|メール転送拒否|WFサーバにメールが転送されてきた場合は、転送を拒否する。|  外部メールサーバ及び内部メールサーバでは、オープンリレー対策を実施している。オープンリレー対策では、SMTPの転送元又は送信元と、エンベロープの受信者ドメイン名の組み合わせで、転送と送信の許可又は拒否を判定する。判定条件は、図1、従業員用PCの使用状況、及び表2を考慮して決めている。外部メールサーバのオープンリレー対策設定を表3に、内部メールサーバのオープンリレー対策設定を表4に示す。 ** 表3 外部メールサーバのオープンリレー対策 |項番|転送元又は送信元|受信者ドメイン名|設定| |1|インターネット|W社ドメイン名|許可| |2|【 c 】|社内のドメイン名|許可| |3|全て|全て|拒否| 注記 項番が小さいものから順に、最初に一致したルールが適用される。 ** 表4 内部メールサーバのオープンリレー対策設定 |項番|転送元又は送信元|受信者ドメイン名|設定| |1|外部メールサーバ|W社ドメイン名|許可| |2|WFサーバ|W社ドメイン名|許可| |3|【 d 】|全て|許可| |4|全て|全て|拒否| 注記 項番が小さいものから順に、最初に一致したルールが適用される。  表2の”PCからのメール受信要求受付”では利用者認証が行われる。しかし、表2の”WFサーバ及びPCからのメール送信要求受付”では利用者認証(以下、”WFサーバ及びPCからのメール送信要求受付”での利用者認証を、送信利用者認証という)が行われておらず、送信利用者認証の実現が課題になっている。 [送信利用者認証と特許検討会の要望の実現に関する検討]  情報システム部のG部長は、送信利用者認証及び特許検討会の要望の実現を検討するように、H主任とJさんに指示した。  H主任とJさんは、G部長の指示について検討し、実現すべき機能を表5のようにまとめた。 ** 表5 実現すべき機能 |項番|課題又は要望|実現すべき機能| |1|送信利用者認証|送信利用者認証機能| |2|メールの検索|メールの保管及び検索機能| |3|電子提出|次の機能を持つ電子提出機能&br()・電子ファイルによる提出機能&br()・電子ファイルへのディジタル署名の付与機能&br()・電子ファイルの署名日の証明機能|  Jさんは、表5の実現すべき機能について検討した。 [送信利用者認証機能に関する具体的な検討]  Jさんは、送信利用者認証機能について、表6に示す具体案をH主任に説明した。 ** 表6 送信利用者認証機能を実現するための具体案 |比較項目|X案|Y案| |名称|POP before SMTP|SMTP Authentication| |利用者ID|送信者メールアドレス|送信者メールアドレス| |パスワード|POP3用パスワード|POP3用パスワード| |方式|POP3の認証が行われたIPアドレスから内部メールサーバへのメール送信を、認証後、一定時間だけ許可する。|PCから内部メールサーバへのメール送信時に、利用者IDとパスワードによる認証を行う。認証が成功した場合は、メール送信を許可する。|  Jさんは、PCからのメール送信方法が現在と変わらないX案を採用したいと、H主任に説明した。H主任は、W社におけるPC及びメールの利用状況を考慮すると、X案では、POP3の認証を実行しなくてもメールを送信できる場合があり、課題が解決できないことを指摘した。H主任の指摘を踏まえて、Y案が採用されることになった。 [メールの保管及び検索機能に関する具体的な検討]  Jさんは、内部サーバLANにアーカイブサーバを導入してメールの保管及び検索機能を実現することとし、図2に示すアーカイブサーバの機能及び運用案を作成した。 ** 図2 アーカイブサーバの機能及び運用案 #divclass(blackdiv){ 1.技術情報の電子ファイルを添付したメールの送信ルール >経営管理部、開発部及び製造部の主任以上による技術情報の検索を可能にするために、従業員が技術情報の電子ファイルを添付したメールを送信する場合は、内部メールサーバ上の技術情報同報専用のメールアドレス(以下、専用メールアドレスという)にも同報する。 2.メールの複製及び保存 >2.1 内部メールサーバは、受け取ったメールを、ウイルススキャン後に複製する。複製したメールにエンベロープなどの情報を付加し、アーカイブサーバに転送する。 > >2.1 アーカイブサーバに転送されたメールは、全て注ぎのように保存する。 > メールは、ハードディスクに一時的に保存する。保存したメールは、定期的に、一度だけ書き込み可能な媒体(以下、WORM(Write Once Read Many)媒体という)に保存した後、ハードディスクから削除する。これらの処理は自動的に実行する。 > >2.3 WORM媒体の保存期間は、10年間とする。 3.メールの検索と検索したメールのダウンロード >3.1 Webによるアーカイブサーバの検索機能を提供する。検索を行う場合は、WORM媒体からハードディスクにメールを一時的に書き戻す。 > >3.2 従業員は自身のメールアドレスから送信したメール及び自身のメールアドレス宛てに届いたメールの検索を行うことができる。 > >3.3 経営管理部、開発部及び製造部の主任以上は、3.2に加えて、1.の専用メールアドレス宛てに同報されたメールの検索も行うことができる。 > >3.4 3.2、3.3以外のメールを検索する場合は、人事総務部長の承認を必要とする。 > >3.6 検索したメールは必要に応じて、ダウンロードできる。 4.アーカイブサーバの機能周知 >4.1 アーカイブサーバの運用を開始する前に、全従業員にアーカイブサーバの機能を説明する。 >(以下、省略) } ** 図2 アーカイブサーバの機能及び運用案
* 問1 業務パッケージの開発に関する次の記述を読んで、設問1~4に答えよ。  U社は、従業員数100名のソフトウェア開発会社で、以前は受託開発を主に行っていたが、数年前から業務パッケージの開発も手がけるようになり、業績を伸ばしている。今回、新たに美容室向けの自社製品として、表1の機能を備えた美容室管理システム(以下、HSSという)を開発することが決まり、M専務が開発責任者になった。M専務は、美容室がHSSを運用することは難しいと考え、U社がHSSを運用し、インターネット経由で美容室へサービスを提供する、いわゆるSaaS型の商品とすることにした。また、美容室間の情報の独立性を高めるために、美容室ごとに仮想サーバを用意し、その上でHSSを運用することにした。 ** 表1 HSSの機能 |機能名称|機能概要| |顧客管理|美容室の顧客の氏名、住所、注文履歴などの管理| |予約管理|来店予約の管理| |従業員管理|美容室の従業員の氏名、役職、勤務シフト、勤怠などの管理| |売上管理|売上の管理| [機能要件の定義]  M専務は、HSSの要件定義から詳細設計までを担当するグループ(以下、Sグループという)を編成し、T主任をリーダに任命した。Sグループは、HSSの想定契約先に関する調査などを行い、機能要件の定義を行った。そのうち、顧客管理と予約管理に関する機能要件は、それぞれ図1、図2のとおりである。 #divclass(blackdiv){ ・顧客データは、データベース内に格納する。 ・顧客データのメンテナンスは、美容室内の管理端末から美容室の従業員が行う。ただし、一部の顧客データについては、Webサイトで顧客が変更できる。 ・顧客データのうち、顧客から取得するものは次のとおりとする。取得は対面で行う。 ・・氏名、住所、生年月日、性別、電話番号、メールアドレス、美容室に対する要望。 ・顧客データのうち、システムが付与するものは次のとおりとする。 ・・顧客ID、パスワードの初期値 ・顧客は、Webサイトで、自分の顧客データわ閲覧できる。 (以下、省略) } ** 図1 顧客管理の機能要件 #divclass(blackdiv){ ・美容室の従業員は、美容室内の管理端末から、全ての顧客の来店予約ができる。 ・顧客は、Webサイトで、自分の来店予約ができる。 ・予約データはデータベース内に格納し、内容は次のとおりとする。 ・・予約年月日、予約時刻、担当美容師、顧客ID、注文メニュー、美容室へのメッセージ ・予約に当たっては、担当美容師を指定する。 ・予約に当たっては、注文メニューを指定する。 } ** 図2 予約管理の機能要件  なお、HSSでは美容室の従業員及び顧客の利用時に認証を行う。 [システム・ソフトウェア要件定義]  Sグループは、システム方式設計及びソフトウェア要件定義を開始し、まず図3のとおり、ソフトウェア構成を決定した。  なお、図3中の太線枠内が今回HSSとして開発するWebアプリケーションである。 &ref(2013SPSCPM201_01.png) [リスクアセスメント]  M社専務は、HSSでは、美容室が顧客から取得した個人情報を含む情報資産を取り扱うことから、情報の漏えいや滅失の可能性を評価するためにリスクアセスメントを実施し、その結果に基づきソフトウェア要件の中でセキュリティ仕様を定めることにした。この作業を、ソフトウェア要件定義の他のタスクと並行して行うために、Sグループとは別のグループ(以下、Rグループという)を編成した。  Rグループでは、次の(1)~(3)の手順に従ってリスクアセスメントを実施した。 >(1) 表2のように、美容室における情報資産の分類を定義した。 >(2) 表3のように、HSSで取り扱う情報資産を特定し、情報セキュリティの3要素に照らして情報資産の分類を行った。 >(3) 各情報資産に対する脅威と脆弱性を特定し、それぞれについてリスク分析を行い、その結果を取りまとめた。そのうち、顧客データに対する結果を表4に示す。 ** 表2 美容室における情報資産の分類の定義 |分類|定義| |I|・美容室の顧客に直接被害が及ぶ。&br()・美容室の存続に関わる程の被害が発生する。| |II|・従業員や取引先に直接被害が及ぶ。&br()・美容室の営業に支障が発生する。| |III|・直接的なは大きな被害や影響は発生しない。| ** 表3 HSSで取り扱う情報資産(抜粋) |情報資産|概要|【a】に係る分類|完全性に係る分類|可用性に係る分類| |顧客データ|顧客の氏名、顧客ID、パスワードなど|I|I|I| |予約データ|予約状況に関する情報|I|I|I| |従業員データ|従業員の氏名、従業員ID、パスワードなど|II|II|I| |売上げデータ|販売状況に関する情報|III|II|III| ** 表4 顧客データに対するリスク分析の結果(抜粋) |リスクNo.|脅威|脆弱性|被害|発生確率 1)|深刻度 2)|対応要否 3)| |1|インターネット経由のHSSへの不正アクセス|【b】|情報漏えい|高|高|要| |2|~|Webアプリケーションのセキュリティホール|情報漏えい|中|高|要| |3|~|Webサーバ基板のセキュリティホール|情報漏えい|中|高|要| |4|~|脆弱な認証とアクセス権管理の仕組み|情報漏えい|低|高|要| |5|美容室従業員による物品持ち去り|物品管理の不備|情報へのアクセス不能|低|中|不要| |6|~|【c】|情報へのアクセス不能|低|中|不要| |7|美容室従業員による不正アクセス|【b】|情報漏えい|中|高|要| |8|~|脆弱な認証とアクセス権管理の仕組み|情報漏えい|低|高|要| |9|不正プログラムによる管理端末からの情報窃取|ウイルス対策ソフトの停止|情報漏えい|低|中|不要| |10|~|未知のウイルスへの未対応|情報漏えい|低|中|不要| 注  1) 脅威が脆弱性を悪用し被害が発生する確率  2) 被害が発生した場合の、被害の深刻さ  3) リスクに対応するために、HSSに管理策を施す必要性の有無 [セキュリティ仕様の決定]  Rグループはリスク分析の結果から、Webアプリケーションに係るセキュリティ仕様とHSSの運用管理に関する要点を取りまとめた。そのうち、顧客管理機能に関するセキュリティ仕様を表5に、HSSの運用管理に関する要件を表6に示す。 ** 表5 顧客管理機能に関するセキュリティ仕様(抜粋) |機能|仕様|リスクNo. 1)| |顧客の認証|・顧客の認証用パスワード設定時に、次の条件を強制する。&br() - 長さ:8文字以上&br() - 文字種:英字、数字、記号の3種類全てを含む。&br() - 別途指定する禁止文字列を含まない。&br()・パスワードの入力を所定回数連続して誤った場合【d】|1, 4| |美容室の従業員の認証|・美容室の従業員の認証では、顧客の認証と同様の認証に加えて、クライアント証明書によるクライアント認証を実施する。|7, 8| |Web画面入出力|・Web画面からの入力については、全て値チェックを行う。&br()・Web画面の出力時には、エスケープ処理を行う。&br()(以下、省略)|【e】| |権限管理|・次のロールを定義し、最小権限を与える。&br() - HSSのシステム管理者&br() - HSSのデータ管理者&br() - 美容室の従業員&br() - 顧客|1, 4, 7, 8| 注 1) リスクNo.は表4中のリスクNo.のうちで、該当するものを示す。 ** 表6 HSSの運用管理に関する要件(抜粋) |適用対象|要件|リスクNo. 1)| |インターネットからのアクセスを受け付ける回線|・ファイアウォールを設置し最小限のアクセスだけを許可する。&br()・IPSを設置し、不正アクセスの検出と、自動遮断を行う。&br()・Webアプリケーションファイアウォールを設置し、不正なHTTPアクセスを遮断する。|【f】| |インターネットからのアクセスを受け付けるWebサーバ|・【g】|3| 注 1) リスクNo.は表4中のリスクNo.のうちで、該当するものを示す。  Rグループは検討したセキュリティ仕様と運用管理に関する要件をM専務に報告し、その承認を受けた。 [予約管理機能の不具合]  その後、HSSの開発は順調に進み、予約管理機能のうち、顧客が操作する画面の機能テストを開始した。予約管理機能の画面遷移を図4に示す。 #divclass(blackdiv){ 画面1 ログイン &ref(2013SPSCPM201_02.png) ・顧客IDとパスワードを入力して、”ログイン”ボタンを押す。 ・ログインが成功したら、メインニュー(画面省略)が表示される。 ・メインメニューで予約を選択すると、予約日選択画面(画面省略)が表示される。 ・予約日選択画面で予約希望日を選択すると、画面2が表示される。 画面2 予約状況 &ref(2013SPSCPM201_03.png) ・各予約枠内で、○は仮予約状態又は空き状態を、×は予約済み状態を示す。 ・○を選択するとサーブレット”WakuClick”が呼び出される。 ・その予約枠が空き状態であれば仮予約状態とした後に、画面3が表示される。 ・予約枠が仮予約状態の場合、仮予約の有効期間(10分間)を確認し、有効期間を過ぎていれば、この顧客の仮予約に置き換えた後に、画面3が表示される。有効期間内の場合は予約失敗の画面(画面省略)が表示される。 画面3 本予約 &ref(2013SPSCPM201_04.png) ・注文メニュー項目は、所定の選択肢から一つを選択する。 ・美容室へのメッセージ項目は、400字まで自由に入力できる。 ・”予約する”ボタンを押すと、サーブレット”KakuteiClick”が呼び出されて予約確定になり、画面4が表示される。 画面4 予約確定 &ref(2013SPSCPM201_05.png) ・予約確定の画面が表示される。 ・”戻る”ボタンを押すと、メインメニューに戻る。 } ** 図4 予約管理機能の画面遷移  機能テストの結果、複数の予約を同時に処理した場合、画面上では正常に予約が完了したように見えるにもかかわらず、データベースには反映されていないことがあるという不具合が発見された。不具合の原因と思われるプログラムは、図5、図6のとおりである。また、データベースのテーブルは、図7、図8のとおりである。 ** 図5 サーブレット"WakuClick" #divclass(blackdiv){{ &nbsp(1)1: package jp.co.u_sha.hssystem; &nbsp(1)2: &nbsp(1)3: import java.io.IOException; &nbsp(1)4: import javax.servlet.ServletException; &nbsp(1)5: import javax.servlet.http.*; &nbsp(1)6: import java.sql.Connection; &nbsp(1)7: import java.sql.PreparedStatement; &nbsp(1)8: import java.sql.ResultSet; &nbsp(1)9: import java.util.Date; 10: 11: public class WakuClick extends HttpServlet { 12: &nbsp(4)(省略)[initメソッド内に適切な初期化処理を記述] 13: 14:&nbsp(4) static final int RSV_AKI = 0; 15:&nbsp(4) static final int RSV_KARI = 1; 16:&nbsp(4) static final int RSV_KAKUTEI = 2; 17:&nbsp(4) static final long TIMEOUT_KARI = 600000; 18: 19:&nbsp(4) protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 20:&nbsp(4)&nbsp(4) Connection conn; 21:&nbsp(4)&nbsp(4) PreparedStatement psSel, psUp; 22: 23:&nbsp(4)&nbsp(4) (省略)[DriverManagerからConnectionインスタンスを取得し、その参照をconnに代入する] 24:&nbsp(4)&nbsp(4) psSel = conn.prepareStatement("SELECT * FROM rsvList WHERE rsvDate=? AND rsvTime=? AND Biyoshi=?"); 25:&nbsp(4)&nbsp(4) psUp = conn.prepareStatement("UPDATE revList SET Status=?, CustID?, Message=?, Menu=?, LastUpdate=? WHERE rsvDate=? AND rsvTime=? AND Biyoshi=?"); 26: 27:&nbsp(4)&nbsp(4) // サーブレットのセッション情報から、顧客ID情報を取得する 28:&nbsp(4)&nbsp(4) HttpSession session = request.getSession(false); 29:&nbsp(4)&nbsp(4) if (session == null) { 30:&nbsp(4)&nbsp(4)&nbsp(4) (省略)[ログイン未処理のエラーのHTML出力を行って終了する] 31:&nbsp(4)&nbsp(4) } 32:&nbsp(4)&nbsp(4) String logintUserID = (String)session.getAttribute("userID"); // ログイン時の顧客ID 33:&nbsp(4)&nbsp(4) // 選択された予約枠の情報を取得する 34:&nbsp(4)&nbsp(4) String rsvDate = requset.getParameter("rsvDate"); // 予約枠(予約年月日) 35:&nbsp(4)&nbsp(4) String rsvTime = requset.getParameter("rsvTime"); // 予約枠(予約時刻) 36:&nbsp(4)&nbsp(4) String rsvBiyoshi = requset.getParameter("Biyoshi"); // 予約枠(担当美容師) 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(); 43:&nbsp(4)&nbsp(4) rs.next(); 44:&nbsp(4)&nbsp(4) long lastDateTime = rs.getLong("LastUpdate"); 45:&nbsp(4)&nbsp(4) // 現在の時刻を取得する 46:&nbsp(4)&nbsp(4) long nowDateTime = new Date().getTime(); 47:&nbsp(4)&nbsp(4) // 既に仮予約状態であった場合、仮予約の最終更新日時を確認し、TIMEOUT_KARI経過後なら空きにする 48:&nbsp(4)&nbsp(4) int rsvStatus = rs.getInt("Status"); 49:&nbsp(4)&nbsp(4) if (rsvStatus == RSV_KARI) { 50:&nbsp(4)&nbsp(4)&nbsp(4) if ((nowDateTime - lastDateTime) > TIMEOUT_KARI) { 51:&nbsp(4)&nbsp(4)&nbsp(4)&nbsp(4) rsvStatus = RSV_AKI; 52:&nbsp(4)&nbsp(4)&nbsp(4) } 53:&nbsp(4)&nbsp(4) } 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(); 61:&nbsp(4)&nbsp(4)&nbsp(4) (省略)[図6の処理を引き継ぐために、選択した予約枠の情報をサーブレットのセッション情報に保存する] 62:&nbsp(4)&nbsp(4)&nbsp(4) (省略)[画面3のHTML出力を行う] 63:&nbsp(4)&nbsp(4) } else { 64:&nbsp(4)&nbsp(4)&nbsp(4) (省略)[予約失敗の画面のHTML出力を行う] 65:&nbsp(4)&nbsp(4) } 66:&nbsp(4)&nbsp(4) (省略)[後処理を行う] 67:&nbsp(4) } 68:&nbsp(4)&nbsp(4) (省略)[その他の必要なメソッド] 69: } }} 注記1 SQL例外を含め、例外処理については省略している。省略した部分で必要とするクラスに関わるimportの記述も省略している。 注記2 (省略)[・・・]は、その位置に[]内に示す処理が記述されているが、省略していることを示す。 ** 図5 サーブレット"WakuClick"終わり ** 図6 サーブレット"KakuteiClick" #divclass(blackdiv){{ &nbsp(1)1: package jp.co.u_sha.hssystem; &nbsp(1)2: &nbsp(1)3: import java.io.IOException; &nbsp(1)4: import javax.servlet.*; &nbsp(1)5: import javax.servlet.http.*; &nbsp(1)6: import java.sql.Connection; &nbsp(1)7: import java.sql.PreparedStatement; &nbsp(1)8: import java.sql.ResultSet; &nbsp(1)9: import java.util.Date; 10: 11: public class KakuteClick extends HttpServlet { 12: &nbsp(4)(省略)[initメソッド内に適切な初期化処理を記述] 13:&nbsp(4) static final int RSV_AKI = 0; 14:&nbsp(4) static final int RSV_KARI = 1; 15:&nbsp(4) static final int RSV_KAKUTEI = 2; 16: 17:&nbsp(4) protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 18:&nbsp(4)&nbsp(4) Connection conn; 19:&nbsp(4)&nbsp(4) PreparedStatement psSel, psUp; 20: 21:&nbsp(4)&nbsp(4) (省略)[DriverManagerからConnectionインスタンスを取得し、その参照をconnに代入する] 22:&nbsp(4)&nbsp(4) psSel = conn.prepareStatement("SELECT * FROM rsvList INNER JOIN custMaster ON rsvList.CustID=custMaster.CustID WHERE rsvDate=? AND rsvTime=? AND Biyoshi=?"); 23:&nbsp(4)&nbsp(4) psUp = conn.prepareStatement("UPDATE revList SET Status=?, CustID?, Message=?, Menu=?, LastUpdate=? WHERE rsvDate=? AND rsvTime=? AND Biyoshi=?"); 24: 25:&nbsp(4)&nbsp(4) // サーブレットのセッション情報から、選択された予約枠の情報を取得する 26:&nbsp(4)&nbsp(4) HttpSession session = request.getSession(false); 27:&nbsp(4)&nbsp(4) if (session == null) { 28:&nbsp(4)&nbsp(4)&nbsp(4) (省略)[ログイン未処理のエラーのHTML出力を行って終了する] 29:&nbsp(4)&nbsp(4) } 30:&nbsp(4)&nbsp(4) String rsvDate = requset.getParameter("rsvDate"); // 予約枠(予約年月日) 31:&nbsp(4)&nbsp(4) String rsvTime = requset.getParameter("rsvTime"); // 予約枠(予約時刻) 32:&nbsp(4)&nbsp(4) String rsvBiyoshi = requset.getParameter("Biyoshi"); // 予約枠(担当美容師) 33:&nbsp(4)&nbsp(4) String logintUserID = (String)session.getAttribute("userID"); // ログイン時の顧客ID 34:&nbsp(4)&nbsp(4) // 本予約画面で入力された情報を取得する 35:&nbsp(4)&nbsp(4) String serviceMenu = request.getParameter("Menu"); // 選択されたメニュー 36:&nbsp(4)&nbsp(4) String toShop = request.getParameter("Message"); // 入力されたメッセージ 37:&nbsp(4)&nbsp(4) (省略)[前出の六つの変数の入力値チェックを行う] 38:&nbsp(4)&nbsp(4) (省略)[入力値チェックで問題があったら、エラーのHTML出力を行って終了する] 39:&nbsp(4)&nbsp(4) // 指定日時の予約状況を参照する 40:&nbsp(4)&nbsp(4) psSel.setString(1, rsvDate); psSel.setString(2, rsvTime); 41:&nbsp(4)&nbsp(4) psSetl.setString(3, rsvBiyoshi); 42:&nbsp(4)&nbsp(4) ResultSet rs = psSel.executeQuery(); 43:&nbsp(4)&nbsp(4) rs.next(); 44:&nbsp(4)&nbsp(4) int rsvStatus = rs.getInt("Status"); 45:&nbsp(4)&nbsp(4) String rsvUserID = rs.getString("CustID"); 46:&nbsp(4)&nbsp(4) // 現在の時刻を取得する 47:&nbsp(4)&nbsp(4) long nowDateTime = new Date().getTime(); 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(); 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(); 59:&nbsp(4)&nbsp(4)&nbsp(4) (省略)[rs内のデータを基にして図4の画面4(予約確定)のHTML出力を行う] 60:&nbsp(4)&nbsp(4) } else { 61:&nbsp(4)&nbsp(4)&nbsp(4) (省略)[予約失敗の画面のHTML出力を行う] 62:&nbsp(4)&nbsp(4) } 63:&nbsp(4)&nbsp(4) (省略)[後処理を行う] 64:&nbsp(4) } 65:&nbsp(4) (省略)[その他の必要なメソッド] 66: } }} 注記1 SQL例外を含め、例外処理については省略している。省略した部分で必要とするクラスに関わるimportの記述も省略している。 注記2 (省略)[・・・]は、その位置に[]内に示す処理が記述されているが、省略していることを示す。 ** 図6 サーブレット"KakuteiClick"終わり #divclass(blackdiv){{ rsvList[予約リスト] (&u(){rsvDate[予約年月日]}, &u(){rsvTime[予約時刻]}, &u(){Biyoshi[従業員ID]}, CustID[顧客ID], Status[予約状態], Menu[注文メニュー], Messages[美容室へのメッセージ], LastUpdate[最終更新日時]) custMaster[顧客マスタ] (&u(){CustID[顧客ID]}, Name[氏名], Address[住所], Birth[生年月日], Gender[性別], Tell[電話番号], Mail[メールアドレス], Password[パスワード], LastUpdate[最終更新日時]) }} 注記 表記ルール次のとおり。下線は、主キーを表す。 >テーブル名[注釈] (&u(){列名1[注釈]}, &u(){列名2[注釈]}, 列名3[注釈], …, 列名n[注釈]) ** 図7 主なテーブルの構造 #divclass(blackdiv){{ ・rsvListテーブルには、毎月最初の営業日に、翌々月の予約枠に相当する行が全て空き状態として追加される。 ・Statusに"0"が設定されている行は、空き状態を表す。その場合、CustIDには空文字列が設定される。 ・Statusに"1"が設定されている行は、仮予約状態を表す。その場合、CustIDには仮予約を行った顧客の顧客IDが設定される。 ・Statusに"2"が設定されている行は、予約状態を表す。その場合、CustIDには予約を行った顧客の顧客IDが設定される。 ・Biyoshiには、顧客が指定した美容師の従業員IDが設定される。 ・ある行のいずれかの列に更新があった場合、その時刻をLastUpdateに設定する。時刻の単位はミリ秒であり、LastUpdateの型はlong型である。 ・LastUpdateには初期値として"0"が設定される。 }} ** 図8 予約リストテーブルの仕様  不具合の発見を受けて、図5及び図6について、顧客αと顧客βがそれぞれのブラウザから操作を行うことを想定して、ソースコードレビューを行った。  その結果、顧客αと顧客βが、画面2で空き状態であった同一の予約枠をほぼ同時に選択した場合、表7に示す順序で各処理が完了すると、顧客αの仮予約がデータベースに反映されないことが確認できた。 ** 表7 仮予約が無効になる処理の順序 |順序|対象の顧客|処理| |1|α|図5の42行目| |2|β|図5の【 h 】行目| |3|【 i 】|図5の【 j 】行目| |4|【 k 】|図5の【 l 】行目|  更に、&u(){①空き状態であった予約枠を、顧客αが画面2で選択して画面3に進むのと並行して、同一の予約枠を顧客βが画面2で選択した場合、表8に示す順序で各処理が完了すると、顧客βの個人情報が顧客αの画面4に表示されてしまう}ことが確認できた。 ** 表8 個人情報の漏えいにつながる処理の順序 |順序|対象の顧客|処理|備考| |1|α|図5の60行目|| |2|α|図6の42行目|順序1の処理が完了し、10分以上経過してから実行される。| |3|β|図【m】の【n】行目|| |4|α|図【o】の【p】行目|| |5|β|図【q】の【r】行目|| |6|α|図6の58行目|| [予約管理機能における不具合の修正]  Sグループのリーダとしてソースコードレビューに参加していたT主任は、この不具合を修正するために、executeUpdateメソッドでUPDATE文を実行した時、更新した行数が戻り値になることに着目した。そして、図5の25行目のパラメタ付きSQLのWHERE句を修正した上で、図5の60行目のexecuteUpdateメソッドの実行時に異常の発生を検知する仕組みを提案した。この提案に基づき修正されたプログラムは図9のとおりである。 ** 図9 修正されたサーブレット"WakuClick" #divclass(blackdiv){{{ 1~23:(省略)[図5の1~23と同じ] 24:&nbsp(4)&nbsp(4) psSel = conn.prepareStatement("SELECT * FROM rsvList WHERE rsvDate=? AND rsvTime=? AND Biyoshi=?"); 25:&nbsp(4)&nbsp(4) psUp = conn.prepareStatement("UPDATE revList SET Status=?, CustID?, Message=?, Menu=?, LastUpdate=? WHERE rsvDate=? AND rsvTime=? AND Biyoshi=?&u(){AND CustID=? AND 【s】}"); 26: 27~46:(省略)[図5の27~46と同じ] 47:&nbsp(4)&nbsp(4) int rsvStatus = rs.getInt("Status"); 48:&nbsp(4)&nbsp(3)&u(){String rsvCustID = rs.getInt("CustID");} 49:&nbsp(4)&nbsp(3)&u(){if (rsvStatus == RSV_KARI) {} 50:&nbsp(4)&nbsp(4)&nbsp(3)&u(){// 予約状況が空きであることを確認し、仮予約処理を行う} 51:&nbsp(4)&nbsp(4)&nbsp(3)&u(){(省略)[予約リストを適切に更新し、仮予約処理を行う]} 52:&nbsp(4)&nbsp(3)&html(<u> } else if (rsvStatus == RSV_KARI && ((nowDateTime - lastDateTime))&html(<u> > TIMEOUT_KARI)))&html(<u>{</u>) 53:&nbsp(4)&nbsp(4)&nbsp(3)&u(){// 既に仮予約状態であっても、TIMEOUT_KARI経過後なら、自分の仮予約に変更する} 54:&nbsp(4)&nbsp(4)&nbsp(4) psUp.setInt(1, RSV_KARI); psUp.setString(2, loginUserID); psUp.setString(3, ""); 55:&nbsp(4)&nbsp(4)&nbsp(4) psUp.setString(4, ""); psUp.setLong(5, nowDateTime); 56:&nbsp(4)&nbsp(4)&nbsp(4) psUp.setString(6, rsvDate); 57:&nbsp(4)&nbsp(4)&nbsp(4) psUp.setString(7, rsvTime); psUp.setString(8, rsvBiyoshi); 58:&nbsp(4)&nbsp(4)&nbsp(3)&u(){psUp.setString(9, rsvCustID); 【t】;} 59:&nbsp(4)&nbsp(4)&nbsp(3)&u(){if (psUp.executeUpdate() == 【u】) {} 60:&nbsp(4)&nbsp(4)&nbsp(4)&nbsp(4) (省略)[図6の処理を引き継ぐために、選択した予約枠の情報をサーブレットのセッション情報に保存する] 61:&nbsp(4)&nbsp(4)&nbsp(4)&nbsp(4) (省略)[画面3のHTML出力を行う] 62:&nbsp(4)&nbsp(4)&nbsp(3)&html(<u> } else {</u>) 63:&nbsp(4)&nbsp(4)&nbsp(4)&nbsp(3)&u(){(省略)[予約失敗の画面のHTML出力を行う]} 64:&nbsp(4)&nbsp(4)&nbsp(3)&html(<u> }</u>) 65:&nbsp(4)&nbsp(4) } else { 66~71:(省略)[図5の64~69と同じ] }}} 注記1 SQL例外を含め、例外処理については省略している。省略した部分で必要とするクラスに関わるimportの記述も省略している。 注記2 下線は、修正した部分を表す。 注記3(省略)[・・・]は、その位置に[]内に示す処理が記述されているが、省略していることを示す。 ** 図9 修正されたサーブレット"WakuClick"終わり [販売の開始]  U社はその後もHSSのテストを続け、更にいくつかの不具合を発見し、プログラムの修正を行った。その結果、テストを完了し、予定どおりに発売日を迎えることができた。発売後、HSSは順調に契約数を伸ばしており、U社の業績向上に寄与している。 * &aname(設問,option=nolink){設問} 設問1 [リスクアセスメント]についいて、(1)、(2)に答えよ。 >(1) 表3の【a】に入れる適切な字句を答えよ。 [[解説・回答>資格試験/情報処理技術者試験/情報セキュリティスペシャリスト/過去問2013年春午後2/問1設問1-1]] >(2) 表4の中の【b】、【c】に入れる適切な字句を解答群の中から選び、記号で答えよ。 [[解説・回答>資格試験/情報処理技術者試験/情報セキュリティスペシャリスト/過去問2013年春午後2/問1設問1-2]] >解答群 >>ア 管理端末の保守体制の不備 >>イ 推測可能なパスワード >>ウ 耐震性能の不足 >>エ データセンタの施錠管理不良 >>オ 美容室の施錠管理不良 >>カ 防火体制の不備 設問2 [セキュリティ仕様の決定]について、(1)~(4)に答えよ。 >(1) 表5中の【d】に入れる適切な字句を30字以内で述べよ。 [[解説・回答>資格試験/情報処理技術者試験/情報セキュリティスペシャリスト/過去問2013年春午後2/問1設問2-1]] >(2) 表5中の【e】に入れる適切なリスクNo.を一つ答えよ。 [[解説・回答>資格試験/情報処理技術者試験/情報セキュリティスペシャリスト/過去問2013年春午後2/問1設問2-2]] >(3) 表6中の【f】に入れる適切なリスクNo.を二つ答えよ。 [[解説・回答>資格試験/情報処理技術者試験/情報セキュリティスペシャリスト/過去問2013年春午後2/問1設問2-3]] >(4) 表6中の【g】に入れる適切な字句を40字以内で述べよ。 [[解説・回答>資格試験/情報処理技術者試験/情報セキュリティスペシャリスト/過去問2013年春午後2/問1設問2-4]] 設問3 予約管理機能の不具合について(1)~(4)に答えよ。 >(1) 表7を完成させるために、【h】~【l】に入れる適切な字句又は数字を答えよ。 [[解説・回答>資格試験/情報処理技術者試験/情報セキュリティスペシャリスト/過去問2013年春午後2/問1設問3-1]] >(2) 表8を完成させるために、【m】~【r】に入れる適切な字句又は数字を答えよ。 [[解説・回答>資格試験/情報処理技術者試験/情報セキュリティスペシャリスト/過去問2013年春午後2/問1設問3-2]] >(3) 図9を完成させるために、【s】~【u】に入れる適切な字句又は数字を答えよ。 [[解説・回答>資格試験/情報処理技術者試験/情報セキュリティスペシャリスト/過去問2013年春午後2/問1設問3-3]] >(4) 本文中の下線①の事象をテストにおいて再現させるための方法を60字以内で具体的に述べよ。 [[解説・回答>資格試験/情報処理技術者試験/情報セキュリティスペシャリスト/過去問2013年春午後2/問1設問3-4]] 設問4 > 今回のような予約管理機能の不具合を未然に防止するためには、データベースを利用したWebアプリケーションの開発における規約が必要である。特に、データベースから読み込んだデータの更新処理に必要な規約について、Webアプリケーションの特性を考慮した上で80字以内で述べよ。 [[解説・回答>資格試験/情報処理技術者試験/情報セキュリティスペシャリスト/過去問2013年春午後2/問1設問4-1]]

表示オプション

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