エンタープライズ:特集 2003/06/24 00:00:00 更新

JSPプログラミング入門
第3回:HTMLエンコードが必要なJSPプログラミングの基本 (1/5)

連載記事「JSPプログラミング入門」として最終回となる第3回。今回は、最終的な表示を担うWebブラウザ上で、切って考えることのできないHTMLタグとの関わりについて解説していこう。
■連載第3回目のポイント
入力フォームごとの対処方法
「パスワードフィールド」、「チェックボックス」、「ラジオボタン」、「選択フィールド」、「イメージボタン」、「ボタン種別」それぞれのフォーム入力で、HTMLエンコードを意識して注意すべき点を解説

 HTMLのタグフォーマットでは、「<」や「>」などの文字を「<」、「>」として記述しなければならない。第2回目で挙げたリスト4では、その対策をしていないことから、ユーザーからのフォーム入力に「<」や「>」などの文字が含まれている場合、そのまま受け取る。受け取った段階では何ら問題はないが、Webブラウザ上で確認をすると、その結果がHTMLタグと認識整形されるために表示が乱れてしまう。

 このような理由から、「<」や「>」などのHTMLタグとして認識されてしまう文字列は、出力時には表1に示すよう文字の置き換えを行う必要がある。このような変換を「HTMLエンコード」と呼ぶ。HTMLエンコードといっても特に難しいことは無い。単純に文字列の置換処理をすればよいだけだ。その理屈を押さえるために、この記事の中で具体例を示していく。

表1■HTMLエンコード
対象となる文字
置換後の文字
< <
> >
& &
" "

 ここでは、例としてリスト5に示すhtmlencodeメソッドを、リスト3に挙げた「code.jsp」ファイルの末尾に加えてみよう。連載第2回目とつながる関係から、ここではリスト番号の割り振りを第2回からの連番としている。

リスト5■htmlencodeメソッド
  1: <%!
  2: // HTMLエンコードする
  3: public String htmlencode(String original)
  4: {
  5:   StringBuffer retVal = new StringBuffer();
  6:
  7:   // 1文字ずつループ処理する
  8:   for (int i = 0; i < original.length(); i++)
  9:   {
 10:     char c = original.charAt(i);
 11:     switch (c)
 12:     {
 13:       case '<':
 14:         retVal.append("<");
 15:         break;
 16:       case '>':
 17:         retVal.append(">");
 18:         break;
 19:       case '&':
 20:         retVal.append("&");
 21:         break;
 22:       case '\"':
 23:         retVal.append(""");
 24:         break;
 25:       default:
 26:         retVal.append(c);
 27:     }
 28:   }
 29:
 30:   return retVal.toString();
 31: }
 32: %>

One Point:
リスト5では、1文字ずつループ処理することによってHTMLエンコードの置換処理をしている。この処理は、StringオブジェクトのreplaceAllメソッドを使い、正規表現で置換することも可能だ。しかし正規表現による置換は、メモリを消費し、また速度的にもあまり有利ではないため、HTMLエンコード程度の比較的簡単な置換には、正規表現ではなくループ処理をした方がよいだろう。

 リスト4の5行目では、「htmlencode」メソッドを呼び出して出力するようにすれば、出力の際にHTMLエンコードができる。

  5: 入力された商品名は、
  <%= htmlencode(jpn2unicode(request.getParameter("productname"), "EUC-JP")) %>

 HTMLエンコード処理を行うかどうかは、結局のところ「入力フォームにユーザーがHTMLタグを入力することを許可するかどうかのポリシーに依存する」。HTMLタグの入力を許さない場合には、この例のようにHTMLエンコードを行うべきだが、許す場合にはHTMLエンコードを行う必要はない。

 しかし、「HTMLエンコードをしなければ、何かと話題となるWebアプリケーションにおける代表的なセキュリティホール「CSS」(クロスサイトスクリプティング)問題を抱える可能性がある」。このため、HTMLを許容する場合でも何らかの形で文字列を置換処理する工夫が必要だ。例えば、特定のHTMLタグだけは許すものの、「<SCRIPT>」などのスクリプトタグを認識許可させない。このような対処方法も効果的だ。少なくとも、実稼働するアプリケーションを構築する場合には、ユーザーが入力した文字列をそのまま出力してしまうのは避けよう。不正な文字が含まれていないかというチェックを怠ってはならない。

      | 1 2 3 4 5 | 次のページ

[大澤文孝,ITmedia]