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