リスト1の2にあるfn:escapeXmlは、JSTLFunctionsタグライブラリに含まれるタグの1つで(注1)、指定された文字列(ここではフォーム情報"name"の値)に含まれる「<」や「>」「&」などのHTML予約文字を「<」「>」「&」のような文字列にエスケープします。
※注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タグの出力を防ぐことができます。
|