連載
» 2006年03月23日 00時00分 公開

Strutsで作るセキュアWebアプリケーション(1):適切なエスケープ処理でクロスサイトスクリプティングに備える (1/3)

[安西真人,三井物産セキュアディレクション株式会社]

この記事は会員限定です。会員登録すると全てご覧いただけます。

 Webアプリケーションのセキュリティホールが注目を浴びたことから、セキュリティを意識した開発の必要性が高まってきている。今後の流れとして、セキュリティ上満たすべき項目が要件定義の段階から組み込まれるケースが増えていくことが予想されるが、実際の開発現場においてはセキュリティホールをふさぐための実装方法が分からないという声も多いのではないだろうか。

 そういった開発者の負担を少しでも軽くすることができるように、本連載ではJavaにおけるWebアプリケーション開発時に最もよく利用されているStrutsフレームワークの実装に踏み込んで、セキュリティ上注意すべきポイントを解説していきたい。なお、本連載ではStruts 1.2.8を対象として解説を行っていくが、すでにStrutsを利用したWebアプリケーション開発を行っている開発者をターゲットとしているため、Strutsの使用方法、各機能の詳細な説明などは割愛する。

【参考連載記事】
Webシステムのセキュリティ要件(情報マネジメント)
Strutsを使うWebアプリケーション構築術(Java Solutionフォーラム)


 今回は、クロスサイトスクリプティング(Cross Site Scripting:XSS)の脆弱性に関する基本的な実装上の注意点を解説していこう。詳細については「クロスサイトスクリプティング対策の基本」における説明を参照していただくとして、簡潔に述べるとクロスサイトスクリプティングとはユーザーの入力値を基に動的なHTTPレスポンスを生成するアプリケーションにおいて、入力値として渡されたスクリプトコードがWebブラウザ上で動作することに起因する脆弱性のことである。

 この脆弱性から発生する被害は、

  • スクリプトがサイトをまたがることでCookieが盗まれてしまう
  • VBScriptによりローカルのファイルを操作されてしまう
  • HTMLタグが入力値に渡されることでページが改ざんされてしまう

などさまざまである。対策の基本となるのは、HTMLエンコード、URLエンコードと呼ばれるエスケープ処理を適切に行うことである。

bean:writeタグを使ってエスケープ処理を適切に行う

 クロスサイトスクリプティングの問題は、HTML特殊文字をエスケープさせて対策することが基本である。エスケープが必要なHTML上の特殊文字とは、

「<」「>」「&」「"」「'」

などである。動的なパラメータをHTMLに出力する場合には、これらを特殊な意味を持たない文字列に変換するHTMLエンコード処理が必須となる。

 Strutsを使用して動的なパラメータを扱う場合には、ViewコンポーネントであるStrutsカスタムタグライブラリを使用することが多いだろう。Strutsカスタムタグライブラリを使用する際にHTMLエンコード処理を適切に行うには、どのような注意が必要となるだろうか。代表的なカスタムタグであるbean:writeタグを使用した際の動作を見ながら確認していこう。

 まず、入力されたコメントを表示するだけの単純なWebアプリケーションを作成してみる。

<%@page contentType="text/html; charset=Shift-JIS" pageEncoding="Shift_JIS" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<html:html>
<head>
</head>
 <body>
 <html:form action="BeanWrite.do">
  コメントを入力してください。
  <html:text property="comment" /><br>
  <br>
  入力されたコメント:
  <bean:write name="TestForm" property="comment" /><br>
  <html:submit value="送信"/>
 </html:form>
 </body>
</html:html>
beanWrite.jsp

 作成したWebアプリケーションに対し、スクリプトとして動作する値を入力して送信ボタンを押したところ、以下のような画面が表示された。

画面1 スクリプトとして動作する値を入力 画面1 スクリプトとして動作する値を入力

 スクリプトは動作せず、「<script>alert('XSS')</script>」という値がそのまま出力されている。beanWrite.jsp上でHTMLエンコードに関する特別な記載はしていないが、画面1のHTMLソースは以下のようになっており、内部的に何らかの処理が行われていることは間違いないだろう。

<html>
<head>
</head>
  <body>
  <form name="TestForm" method="post" action="/WebAppSec/BeanWrite.do">
   コメントを入力してください。
   <input type="text" name="comment" size="50" value="&lt;script&gt;alert(&#39;XSS&#39;)&lt;/script&gt;"><br>
   <br>
   入力されたコメント:
   &lt;script&gt;alert(&#39;XSS&#39;)&lt;/script&gt;
   <br>
   <input type="submit" value="送信">
  </form>
  </body>
</html>
画面1のHTMLソース

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。