総視聴再生時間43万分以上(2017年5月13日現在)の動画で基本情報技術者試験の過去問&キーワード解説!スキマ時間に動画!〜これじょIT〜

PR広告

平成27年度春 基本情報技術者試験 午後 問11 ソフトウェア開発(Java) 設問2

問11 ソフトウェア開発(Java)

次のJavaプログラムの説明及びプログラムを読んで、設問1、2に答えよ。

〔プログラムの説明〕

 D社では、利用者が入力した文字列をHTMLに埋め込むことによって、動的にWeb ページを生成するアプリケーションを開発している。

 このようなアプリケーションでは、利用者が入力した文字列をHTMLに埋め込む際の処理が不適切な場合、情報漏えいの発生などシステムの安全な運用を脅かすおそれがある。

 利用者が入力した文字列をHTMLに埋め込む前には、サニタイズすることが必要である。サニタイズとは、システムの安全な運用を脅かす文字列を、無害な文字列に変換することをいう。文字列の変換方法は、文字列を埋め込む場所によって異なる。

 当該アプリケーションでは、HTMLのタグの間(ただし、" "との間は除く)に文字列を埋め込むケースと、JavaScriptの文字列として埋め込むケースの二つのケースでサニタイズする必要がある。サニタイズは、変換前の 文字列中の各文字を、それぞれ次のように変換することによって行うことにした。

HTMLのタグの間に文字列を埋め込むケース

英数字と次に示す文字は、そのまま出力する。

 !#$%()*+、-.:;=?@[\]^_'{|}~

表1に示す文字は、実体参照に変換する。

その他の文字は、""に変換する。ここで ddd は変換対象文字の文字コードを表す、最大で5桁の10進数である。また、変換前の文字列に含まれる各文字は、2バイトで表すことができるものとする。

JavaScriptの文字列として埋め込むケース

英数字は、そのまま出力する。

文字コードが256未満の英数字以外の文字は、"\xXX"に変換する。ここで、XXは変換対象の文字の文字コードを表す、2桁の16進数である。

その他の文字は、"\uXXXX"に変換する。ここで、XXXXは変換対象の文字の文字コードを表す、4桁の16進数である。また、変換前の文字列に含まれる各文字は、2バイトで表すことができるものとする。

 クラス Encoder は、サニタイズを行うクラスが継承する抽象クラスである。パブリックメソッド encode は、引数で与えられた文字列をサニタイズし、結果を返す。クラス HtmlEncoder は、HTMLのタグに埋め込む文字列をサニタイズするクラスである。クラス JavaScriptEncoder は、JavaScriptの文字列として埋め込む文字列をサニタイズするクラスである。

【プログラム1】

import java.util.HashMap;
import java.util.Map;

abstract public class Encoder {
   private Map<Character, String> conversionTable = 
      new HashMap();
	  
   protected void addConversion(char c, String s) {
      conversionTable.put(c, s);
   }
   
   protected void addNoConversion(char c) {
      conversionTable.【  a  】;
   }
   
   protected void addNoConversion(char[] collection) {
      for (char c : collection) {
	     addNoConversion(c);
	  }
   }
   
   abstract protected String encode(char c);
   
   public String encode(String s) {
      if (s == null) {
	     return null;
	  }
	  
	  String result = "";
	  for (char c 【  b  】) {
	     String t = 【  c  】;
		 if(t == null) {
		    t = encode(c);
		 }
		 result += t;
	  }
	  return result;
   }
}

【プログラム2】

public class HtmlEncoder extends Encoder {
   private static String ALPHAS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
   private static String NUMERICS = "0123456789";
   private static String PUNCTUATIONS = "!#$%()*+,-.:;=?@[\\]^_`{|}~";
   
   public HtmlEncoder() {
      addNoConversion(ALPHAS.toCharArray());
	  addNoConversion(ALPHAS.toLowerCase().toCharArray());
	  addNoConversion(NUMERICS.toCharArray());
	  addNoConversion(PUNCTUATIONS.toCharArray());
	  addConversion('<', "<");
	  addConversion('>', ">");
	  addConversion('&', "&");
	  addConversion('"', """);
   }
   
   protected String encode(char c) {
      return 【  d  】;
   }
}

【プログラム3】

public class JavaScriptEncoder extends Encoder {
   private static String ALPHAS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
   private static String NUMERICS = "0123456789";
   
   public JavaScriptEncoder() {
      addNoConversion(ALPHAS.toCharArray());
	  addNoConversion(ALPHAS.toLowerCase().toCharArray());
	  addNoConversion(NUMERICS.toCharArray());
   }
   
   protected String encode(char c) {
      if(c 【  e  】 256) {
	     return String.format("\\x%02X", (int) c);
	  }
	  return String.format("\\x%04X", (int) c);
   }
}

設問2

プログラム4を実行したときに、プログラム2のメソッド encode が呼び出される回数として正しい答えを、解答群の中から選べ。  ここで、プログラム1~3中の には正しい答えが入っているものとする。

【プログラム4】

public class HtmlEncoderTest {
    static public void main(String[] args) {
	    new HtmlEncoder().encode("<script type="text/javascript">alert('注意!');</script>");
    }
}

解答群

  • ア : 0
  • イ : 4
  • ウ : 5
  • エ : 13
  • オ : 30

解説

new HtmlEncoder().encode()メソッドでは、HtmlEncoderのインスタンスを生成しつつencodeメソッドを実行しています。HtmlEncoderはコンストラクタを呼び、ハッシュを初期化します。次に「"<script type="text/javascript">alert('注意!');</script>"」を引数に、encodeを呼びます。この引数は文字列なのでプログラム1のencodeが呼ばれます。

設問1で解説したのでかいつまんでの説明となりますが、ここでは文字列を1文字にして、変換が必要かどうかを確認して、変換が必要な1文字をプログラム2のencodeメソッドを呼んで実行します。

encodeメソッドによる変換が必要がないのは、HtmlEncoderのコンストラクタで定義された文字です。プログラム1をみると

public class HtmlEncoder extends Encoder {
   private static String ALPHAS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
   private static String NUMERICS = "0123456789";
   private static String PUNCTUATIONS = "!#$%()*+,-.:;=?@[\\]^_`{|}~";
   
   public HtmlEncoder() {
      addNoConversion(ALPHAS.toCharArray());
	  addNoConversion(ALPHAS.toLowerCase().toCharArray());
	  addNoConversion(NUMERICS.toCharArray());
	  addNoConversion(PUNCTUATIONS.toCharArray());
	  addConversion('<', "<");
	  addConversion('>', ">");
	  addConversion('&', "&");
	  addConversion('"', """);
   }
   
   protected String encode(char c) {
      return 【  d  】;
   }
}

アルファベット "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

数値 "0123456789"

記号の一部 "!#$%()*+,-.:;=?@[\\]^_`{|}~"

実体参照に変換するもの "<", ">", "&", """

です。これ以外の文字は、encodeメソッドにより文字コードに変換します。入力される「"<script type="text/javascript">alert('注意!');</script>"」を1文字ずつみていきましょう!結論から言うとencodeメソッドが必要なのは5つあります!

< <は実体参照に変換されるのでencode無し

s アルファベットはencode無し

c アルファベットはencode無し

r アルファベットはencode無し

i アルファベットはencode無し

p アルファベットはencode無し

t アルファベットはencode無し

> >は実体参照に変換されるのでencode無し

a アルファベットはencode無し

l アルファベットはencode無し

e アルファベットはencode無し

r アルファベットはencode無し

t アルファベットはencode無し

( 指定された記号はencode無し

' 指定されていない記号なのでencodeする

注 encodeする

意 encodeする

! 指定された記号はencode無し

' 指定されていない記号なのでencodeする

) 指定された記号はencode無し

; 指定された記号はencode無し

< <は実体参照に変換されるのでencode無し

/ 指定されていない記号なのでencodeする

s アルファベットはencode無し

c アルファベットはencode無し

r アルファベットはencode無し

i アルファベットはencode無し

p アルファベットはencode無し

t アルファベットはencode無し

> >は実体参照に変換されるのでencode無し

従って、プログラム2のencodeメソッドが呼ばれる回数は「ウ 5」回です!

平成27年度春 基本情報技術者試験 午後 問11 ソフトウェア開発(Java) 目次

  1. 問題文とキーワード
  2. 設問1
  3. 設問2

一覧に戻る

タグ: ,,,,

PR広告

フェイスブックコメント

平成28年度秋 基本情報技術者試験 午後 テキスト・動画解説

平成28年度秋 基本情報技術者試験 午前 テキスト・動画解説

平成28年度春 基本情報技術者試験 午後 テキスト・動画解説

平成28年度春 基本情報技術者試験 午前 テキスト・動画解説

平成27年度秋 基本情報技術者試験 午後 テキスト・動画解説

平成27年度春 基本情報技術者試験 午後 テキスト・動画解説

平成27年度春 基本情報技術者試験 午前 テキスト・動画解説

平成26年度秋 基本情報技術者試験 午前 テキスト・動画解説

平成26年度春 基本情報技術者試験 午前 テキスト・動画解説