<?xml version="1.0" encoding="EUC-JP"?>

<topic name="クロスサイト・スクリプティング脆弱性対策" author="小川 環" date="2002.07.12">
<subsection name="クロスサイト・スクリプティングとは？">
<p>
Webアプリケーションの開発において、<b>クロスサイト・スクリプティング脆弱性</b>は、たいへん深刻なセキュリティ問題となっています。<br/>
<b>クロスサイト・スクリプティング</b>とは、HTML や XML の特性を利用して Web サイトの脆弱性を突くクラッキング手法です。
フォームなどへの入力時に不正な文字列(スクリプト)を打ち込むことによって Cookie の中身が別のサイトに転送され、その結果、第三者が正規のユーザになりすますといった行為を可能とさせます。
これによって、システム内にある個人情報が外部に漏洩されるという危険性が大きくなります。
他のサイトにまたがってスクリプトが実行されることから、<b>クロスサイト・スクリプティング</b>と呼ばれています。
</p>
</subsection>
<subsection name="原因と対策">
<p>
<b>クロスサイト・スクリプティング</b>は、<u>変数や文字列の値を画面上に出力する際、HTML などのマークアップ言語で定義されている一部の特殊文字をエスケープ出力させなければならない処理を、コンテンツの開発者が実装し忘れてしまうこと</u>が大きな原因となっています。<br/>
そこで JSTL では、文字列や変数の値を出力するために使用されていた <b>&lt;%= expression %&gt;</b> タグの代わりに、<b>&lt;c:out&gt;</b> および <b>&lt;x:out&gt;</b> の両タグを標準で用意しています。
これらのタグに対し <b>escapeXml</b> 属性を有効 ( true ) にした状態で実行させると、下の表に示されている特殊文字が自動的にエスケープ出力されるようになります。
なお、<b>escapeXml</b> 属性は、デフォルトで有効 ( true ) とするよう JSTL 仕様で定められています。
<blockquote>
<table>
<tr>
<th>エスケープ文字</th>
<th>出力エンティティ文字</th>
</tr>
<tr>
<td align="center">&lt;</td>
<td align="center">&amp;lt;</td>
</tr>
<tr>
<td align="center">&gt;</td>
<td align="center">&amp;gt;</td>
</tr>
<tr>
<td align="center">&amp;</td>
<td align="center">&amp;amp;</td>
</tr>
<tr>
<td align="center">&#039;</td>
<td align="center">&amp;#039;</td>
</tr>
<tr>
<td align="center">&#034;</td>
<td align="center">&amp;#034;</td>
</tr>
</table>
</blockquote>
例)
<blockquote><source>
<![CDATA[
  <%-- 特殊文字が、まったくエスケープ出力されない --%>
  <% if (customer.getAddress() != null)  { %>
      <%= customer.getAddress() %>
  <% } else { %>
      <%= "<不明>" %>
  <% } %>
->
  <%-- 特殊文字(<,>,&,',")が、エスケープ出力される --%>
  <c:out value="${customer.address}" default="<不明>" escapeXml="true"/>
]]></source></blockquote>
<note>
<b>&lt;c:out&gt;</b> および <b>&lt;x:out&gt;</b> のエスケープ文字は、基本的に XML のメタ文字を対象としています。<br/>
-&gt; <a href="http://nagoya.apache.org/bugzilla/show_bug.cgi?id=7746" target="bugzilla">Bug 7746 ( Apache Bug Database )</a>
</note>
</p>
</subsection>
<subsection name="関連リンク">
<p>
<ul>
<li><a href="http://www.ipa.go.jp/security/awareness/vendor/programming/a01_02.html" target="CrossSiteScripting">セキュア Web プログラミング - クロスサイトスクリプティング ( 情報処理振興事業協会 )</a></li>
<li><a href="http://securit.etl.go.jp/" target="CrossSiteScripting">SecurIT ( 独立行政法人 産業技術総合研究所 グリッド研究センター )</a></li>
<li><a href="http://www.microsoft.com/japan/TechNet/security/virus/crssite.asp" target="CrossSiteScripting">クロスサイト・スクリプティング脆弱性に関する情報 ( Microsoft )</a></li>
<li><a href="http://www.owasp.org/asac/input_validation/css.shtml" target="CrossSiteScripting">Input Validation - Cross Site Scripting ( OWAS Project )</a></li>

</ul>
</p>
</subsection>
</topic>
