XSS(クロスサイトスクリプティング)対策に便利なFireFoxアドオンXSS Me | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

Webサイトを構築した時のセキュリティ対策として、XSS(クロスサイトスクリプティング)への対応を行うと思いますが、単純なテストケースを作って問題ないと判断しても、実は結構なリスクが隠れてたりする、ということは良くあります。

また、どこまでのテストをすればよいのかわからないと言うエンジニアも多いと思いますので、客観的なテストツールなどがあれば便利です。


XSS対策ツールとして、FireFoxアドオンのXSS Me を使えば、かなり簡単に対応状況をレポートで見ることができます。



XSS Meでチェックしてみるフォーム


まず、最初にXSS MeでチェックしてみるHTMLを用意します。

今回は、簡易的に2つのテキストボックスを用意して、送信先(hoge.php)にて一方のテキストボックスのデータの内容を実体参照に変換し(XSS対策あり)、もう一方のほうはそのまま画面へ出力(XSS対策なし)してしまうものを用意してみました。


<form action="hoge.php" method="post" name="form1">
    ID:<input type="text" name="id" size="50"><br />
    NAME:<input type="text" name="name" size="50"><br />
    <input type="submit" value="送信" name="button1">
</form> 

データを受信するhoge.phpは、こんな感じ


<?php

// ID属性のテキストボックスの内容をエスケープ
echo htmlspecialchars($_POST['id']), ENT_QUOTES);

echo "<br />";

// NAME属性のテキストボックスの内容はそのまま
echo $_POST['name'];

?>


この状態だと、XSS対策がされていないname属性のテキストボックスに「<script>alert('test');</script>」みたいな文字を入力してみると、下記のようにアラートのダイアログが出てきてしまいます。


A Day In The Boy’s Life-XSS-1


また、ID属性のテキストボックスに埋め込まれた内容は実体参照に変換されてるからといって、これだけで安心なのか、と言う不安もあったりします。



XSS Meでテストしてみる


では、実際にFireFoxアドオンのXSS Me を使ってみましょう。

インストールが完了すれば、チェックしたいページでXSS Meを開きます。(ツール > XSS Me > Open XSS Me Sidebar)


A Day In The Boy’s Life-XSSMe


XSS Meを開くと該当ページに対するフォームとHTML要素の一覧が表示されます。

該当のHTML要素(例えばテキストボックス)に対してどのようなテストをしたいか、プルダウンメニューよりテストケースを選択できます。


A Day In The Boy’s Life-XSSMe-2


ただ、どれをテストすればいいのか良くわからないとか、一つ一つテストするのが面倒だと言うのであれば、その上にある「Test all forms with all atacks」というボタンを押せばよいでしょう。

全てのフォームに対して、XSS Meで持っている全てのテストケースを実行してくれます。



XSS Meの実行結果のレポートを見てみる


実行結果は全て英語になりますが、視覚的にわかりやすく表現されていますので、難しいことは無いと思います。


A Day In The Boy’s Life-XSSMe-3


一番上には、XSSの脅威となりえる8つの記号が表示され、それぞれテスト結果できちんとエスケープなどの処理がされているかが表示されます。

その次には、テスト結果で問題となる点、注意すべき点などの総数がグラフで表示されます。


さらにレポートを読み進めると、問題点や注意点に対する詳細が書かれています。


A Day In The Boy’s Life-XSSMe-4


これまた英語にはなりますが、テストした結果どのような危険性があるのかが書かれています。


一応エスケープしていたID属性のテキストボックスですが、危険があることがわかったので、多少乱暴ですがその他の危険性のある文字列を無効化するような処理を加えて見ます。


<?php

// 削除する文字列
$escape_char = array("/", "=", ";", "\\");

// ID属性のテキストボックスの内容を出力
echo htmlspecialchars(str_replace($escape_char, "", $_POST['id']), ENT_QUOTES);

echo "<br />";

// NAME属性のテキストボックスの内容はそのまま
echo $_POST['name'];

?>


これで実行してみると・・・。


A Day In The Boy’s Life-XSSMe-5


危険性のある記号については、ちゃんと処理されていることがわかりますね。


これで絶対安心と言うわけではないでしょうが、テストを簡易的に行いたいとか、ページの安全度を客観的に判断したいとか、そういった使い方にはかなり有効なツールになるのではないでしょうか。