TOPサーバ構築・運用> リクエストデータの利用
はじめてのサーバサイドJava
はじめてのサーバサイドJava

第7回:リクエストデータの利用(後編)

著者:山田 祥寛   2006/4/28
1   2  3  次のページ
リクエストデータの利用

   前回に引き続きリクエストデータの利用について解説します。今回は、入力文字の注意点と入力文字コードの宣言についてです。また、参考にするrequest.jspは前回と同じものです(リスト1)。
リスト1:request.jsp(再掲)
<%@ page contentType="text/html;charset=Windows-31J" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<fmt:requestEncoding value="Windows-31J" /> (3)
<html>
<head>
<title>リクエストデータの処理</title>
</head>
<body>
<form method="POST" action="request.jsp">
名前:
<input type="text" name="name" size="10" />
<input type="submit" value="登録" />
</form>
<c:if test="${!empty param['name']}"> (1)
こんにちは、${fn:escapeXml(param['name'])}さん! (2)
</c:if> 
</body>
</html>


入力文字は必ずエスケープする

   リスト1の2にあるfn:escapeXmlは、JSTLFunctionsタグライブラリに含まれるタグの1つで(注1)、指定された文字列(ここではフォーム情報"name"の値)に含まれる「<」や「>」「&」などのHTML予約文字を「&lt;」「&gt;」「&amp;」のような文字列にエスケープします。

※注1:
Functionsタグライブラリは、JSTL 1.1から導入された新しいタグライブラリです。ほかのタグライブラリと異なり、アクションタグの形式ではなく、式言語の中で利用可能な関数を提供します。Functionsタグライブラリの主なタグは、表1の通りです。

タグ名 概要
fn:contains(str,substr) 文字列に部分文字列が含まれているか
fn:containsIngnoreCase(str,substr) 文字列に部分文字列が含まれているか(大文字/小文字を無視)
fn:endsWith(str,suffix) 文字列が指定された接尾辞で終わるか
fn:escapeXml(str) 文字列に含まれるXML予約文字(<、>、&など)をエスケープ
fn:indexOf(str,substr) 文字列に含まれる部分文字列の登場位置を検索
fn:join(array,delim) 配列内の各要素を指定された区切り文字で連結
fn:length(array|str) コレクション(配列)に含まれる要素数、文字列長を取得
fn:replace(str,before,after) 文字列中の指定された部分文字列を置き換え
fn:split(str,delim) 文字列を指定された区切り文字で分割
fn:startsWith(str,prefix) 文字列が指定された接頭辞で始まるか
fn:substring(str,begin,end) 文字列のbegin〜end文字目を取得
fn:substringAfter(str,substr) 指定された部分文字列より以降を取得
fn:substringBefore(str,substr) 指定された部分文字列より以前を取得
fn:toLowerCase(str) 小文字に変換
fn:toUpperCase(str) 大文字に変換
fn:trim(str) 文字列の前後から空白を除去

表1:Functionsタグライブラリに含まれる主なタグ

   HTMLの予約文字を含む可能性がある文字列(特にクライアントから入力された文字列)は、必ずfn:escapeXmlでエスケープ処理を行うようにしてください。

   例えば、fn:escapeXmlを介さない、以下のようなコードは致命的なセキュリティホールを含みます。

こんにちは、${param['name']}さん!

   request.jsp(リスト1)の2の行を上記のコードで置き換えたうえで、テキストボックスに以下のように入力してみましょう。

<script language="JavaScript">alert('セキュリティ・ホール発見!');</script>

   これを実行すると、入力されたクライアントサイドスクリプトがそのまま実行されてしまうのが確認できるはずです(図1)。

典型的なクロスサイトスクリプティングの例
図1:典型的なクロスサイトスクリプティングの例

   管理者が意図しないプログラムが、第三者によって勝手に実行できてしまうのです。これを「クロスサイトスクリプティング」脆弱性といいます。

   これはごく単純な例ですが、このようなクロスサイトスクリプティングを利用することで、悪意ある第三者が任意のユーザのCookieを盗聴したり、特定のファイルを転送することも可能になります。

   このような脆弱性を防ぐのが、エスケープ処理です。表示に先立って、HTML予約文字をエスケープ処理することで、意図しないHTMLタグの出力を防ぐことができます。

1   2  3  次のページ

WINGSプロジェクト  山田 祥寛
著者プロフィール
有限会社WINGSプロジェクト   山田 祥寛
Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト(http://www.wings.msn.to/)」の代表。主な著書に「10日でおぼえる入門教室シリーズ(Jakarta・JSP/サーブレット・PHP・XML)」(以上、翔泳社)、「書き込み式 SQLのドリル」(ソシム)など。最近ではIT関連技術の取材、講演まで広くを手がける毎日。

INDEX
第7回:リクエストデータの利用(後編)
リクエストデータの利用
  入力文字コードの宣言は必須
  ヘッダ情報による制御