XSSの対策といっても、何をすればいいのでしょう?
一番スタンダードな方法は、フォームから送られてくる文字列をHTMLタグとして解釈されないように、一部の記号をWebブラウザ上での表示に利用できる実体参照に変換する方法です。
一般的によく狙われる文字は以下の表にまとめてあります。内容に変換するようにコードを変更すれば、対策可能です。
変換する文字 | 変換後の文字 |
< | < |
> | > |
‘ | ' |
“ | " |
(スペース) | |
POSTでのフォーム送信には失敗し、GETでのリクエスト処理には無反応という結果が分かっています。なぜ、このようなことになっているのでしょうか?
それは、このWebアプリケーションではPOSTによって受け渡されたデータをチャット内容として送信していたからです。
該当部分のソース |
if ("POST".equals(request.getMethod())) { |
ここの処理で上記表の対応文字の変換を行ってあげればいいのです。
例えば、以下のようなファンクションを作成してこのファンクションで文字列を処理してあげればよいのです。
public String encodeHTML(String str){ |
それでは、実際に第3回に作成したサーブレットに組み込んでみましょう。まずは、サーブレットの設置されたディレクトリに移動します。移動したら、サーブレットの作成に移ります。Cometはイベント受信後、エディタでCometServlet.javaを作成します。サーブレットには、以下の内容を記述していきます。
CometServlet.java(※赤の部分が追加した部分) |
……(省略)
…… |
以上でサーブレットの修正は完了しました。それでは、修正したサーブレットをコンパイルしましょう。
javac -classpath /opt/tomcat6/lib/servlet-api.jar:/opt/tomcat6/lib/catalina.jar CometServlet.java |
最後に、Tomcatの再起動を実行します。
/etc/rc.d/init.d/tomcat restart |
それでは、あらためてXSSが発生しないかどうか、確認してみましょう。各入力項目に「<script language="javascript">alert('hoge')</script>」を入力します。
そして、送信ボタンを押すと……。
無事に入力した内容がそのまま画面に表示されるようになりました。このページのソースをテキストエディタでのぞいてみます。
[<language="javascript"?script>alert('hoge')</script>]: <language="javascript"?script>alert('hoge')</script> |
この内容が以下のように変換されていました。
[<script language="javascript">alert('hoge')</script>]: <script language="javascript">alert('hoge')</script> |
「<」や「>」などのタグの開始と終わり、「'」や「"」などの文字列を表す記号、半角スペースも正しく実体参照に変換されていました。
今回のチャットアプリケーションでの対応はここまでにしますが、利用する言語やケースに応じて以下の文字についても対応することを検討した方がよいでしょう。
変換する文字 | 変換後の文字 |
( | ( |
) | ) |
# | # |
& | & |
上記のような方法も実際には確認されていますので、下記のことは必ず忘れずに気を付けておきましょう。
Webアプリケーションの脆弱性は開発者ならいつも気にしなければいけないことですが、見落としたり気付かなかったりすることが多いので、自動的にチェックしてくれるツールを活用したり、よくあるセキュリティホールだけでも定期的に確認することでセキュリティ被害に遭わないように努めていきましょう。
次回で連載はいよいよ最後になりますが、アプリケーションを提供するユーザーによる悪意のある攻撃やミスによるトラブルを未然に防ぐための機能「セキュリティマネージャー」について解説します。
x-lab チーム
株式会社アメニクスのR&D部門として、企業の価値向上を目的に結成された研究開発チーム(x-lab=amenix laboratory)。
アメニクスの社員をはじめ、システム開発技術者のみに限らず、MBA教授や外資系出身エンジニアなど幅広いメンバーが所属している。IT技術からマーケティング、金融テクノロジーなどさまざまな分野で活動中。
主な著書
Copyright © ITmedia, Inc. All Rights Reserved.