2016年12月18日日曜日

[平成27年度春] 午後 問11 解説

[問題文・解答]


平成27年度4月に実施された基本情報技術者試験の午後試験の問題・解答はIPA公式ページからダウンロード出来ます。(以下リンク)

[問題概要]


この問題は、選択問題で問9〜問13のうち1問を選択する必要があります。
出題分野はソフトウェア開発(Java)で、問題の題材はセキュアプログラミングです。
HTMLに埋め込む文字列からシステムの運用を脅かす危険な文字列を安全な文字列に変換する(サニタイズ)Javaプログラムについて問われます。Javaの基礎知識が必須の問題です。

[設問1]


a) プログラム1は抽象クラスEncoderを実装しています。このクラスではまず(char型)とサニタイズ後の表現(String型)の対応を格納するMapインタフェースconversionTableを定義しています。
メソッドaddConversionはサニタイズにより変換を行う文字のconversionTableへの登録、メソッドaddNoConversionはサニタイズ後もそのまま出力する文字の登録を行うメソッドです。従って、aの行では引数である文字'c'をString型に変換した値をconversionTableに登録(put)する必要があります。P.66のStringクラスの説明を参考にするとaには「put(c, String.valueOf(c)」が当てはまるため「ウ」が正解です。

b,c) P.52中段に説明があるようにメソッドencodeは、引数で与えられた文字列(String型)をサニタイズした結果(String型)を返します。よって、処理の流れとしてはサニタイズ後の結果を格納する文字列resultを初期化し、引数の文字列sに対して先頭から1文字ずつ変換してresultの末尾に格納していきます。
bの行は文字列sに対して先頭から1文字ずつ走査していくfor文の記述です。P.66のString型の説明を参考にするとbには「 : s.toCharArray()」が当てはまるので「イ」が正解です。
cの行はconversionTableから文字cの変換後の文字列を求め、tに代入します。その後、tがnullの場合つまりcの変換が規定されておらずconversionTableに登録されていない場合はencode(c)を実行し、resultの末尾にtを格納します。従って、cには「conversionTable.get(c)」が当てはまるので「ウ」が正解です。

d) プログラム2はHTMLタグに埋め込む文字列をサニタイズするクラスHtmlEncoderを実装しています。冒頭でP.51(1)の①②に記載された文字を定義し、コンストラクタ中でこれらの文字と変換後の文字列の対応をconversionTableに登録しています。
メソッドencodeは、上記c)の説明中の「cの変換が規定されておらずconversionTableに登録されていない場合」に実行されるメソッドです。P.51(1)の③より「その他の文字は"&#ddd;"に変換する。ここで、dddは変換対象文字の文字コードを表す、最大5桁の10進数である。」とあることから、encodeは、"&#ddd;"の形式の文字列を返せばよいです。(dddは文字cの文字コード)
従って、dには「"&#" + (int)c + ";"」が当てはまるため「ア」が正解です。

e) プログラム3はJavaScriptの文字列として埋め込む文字列をサニタイズするクラスJavaScriptEncoderを実装しています。処理の流れとしては、プログラム2とほぼ同じです。
eのif文の処理はP.52(2)の②「文字コードが256未満の英数字以外の文字は、"\xXX"に変換する。ここで、XXは変換対象の文字の文字コードを表す、2桁の16進数である」の部分に該当します。従って、eには「<」が当てはまるので「イ」が正解です。

[答] a) ウ b) イ c) ウ d) ア e) イ

[設問2]


設問1のdの説明でも述べたようにプログラム2のメソッドencodeが実行されるのは、変換対象文字の変換がconversionTableに登録されていない場合、つまりP.51(1)の③の場合です。よって、プログラム4で指定された文字列"<script>alert('注意!');</script>"のうち、P.51(1)の①②で指定されていない文字の個数分だけencodeが実行されます。
対象となる文字は、「'」、「注」、「意」、「'」、「/」の5文字なので5回で「ウ」が正解です。

[答] ウ

上記の解説は問題と解答を元に自分なりの考え方を記述しており、間違っている部分もあるかと思いますので、ご了承願います。また、誤りについては正しい考え方をご指摘・ご教授頂けると助かります。

0 件のコメント:

コメントを投稿