初回はWeb2.0の中核技術ともいえるAjaxを見ていきたいと思います。
Ajaxのセキュリティについて考えていきますが,その前にAjaxについて簡単におさらいしてみましょう。
AjaxとはAsynchronous JavaScript XMLの略であり,一言で言えばJavaScriptとXMLを使って非同期に通信するということです(XML以外の形式が使われることも多くなりました)。通信を非同期にすることで,何か処理をする場合にいちいち待たなくても次の処理に移ることができます。その結果,ユーザを待たせずに多くの処理を行えるようになりました。また,画面全体を再読み込みする必要がなくなったことも,使い勝手の向上した理由です。
Ajaxの動作
それでは簡単なサンプルコードでAjaxの動作を見ていきたいと思います(リスト1)。これらはAjaxの入門サイトや書籍で一番最初に出てくるコードですので見たことのある方もいらっしゃると思います。
リスト1 Ajaxのサンプルコード
<script language="javascript">
var req;
if( window.XMLHttpRequest){
req = new XMLHttpRequest();
}else if(window.ActiveXObject){
try {
req = new ActiveXObject("MSXML2.XMLHTTP");
} catch (e) {
req = new ActiveXObject("Microsoft.XMLHTTP");
}
}
if (req) {
req.open('GET', 'http://www.example.com/contents.txt');
req.onreadystatechange = function() {
if (req.readyState == 4) {
document.write(req.responseText);
}
}
req.send(null);
}
</script>
contents.txtの内容
Hello Ajax.
index.htmlを開くとスクリプトが実行され,ブラウザはcontents.txtファイルを取得して表示します。画面全体を再読み込みすることなくページの内容が変化するというのがAjaxの特徴です(図1)。
Ajax以前の脆弱性
リスト1で呼び出したのはcontents.txtという静的なファイル(毎回同じ内容のファイル)でしたが,実際にAjaxを多用したサイトを作成する場合には,呼び出すファイルの内容も動的に変化させたくなるでしょう。そもそも毎回同じ内容のファイルだったら毎回Ajaxで読み込む必要がありませんからね。
さて,動的に変化する内容にする場合には,呼び出す対象はcontents.txtではなくcontents.cgiとなります。
これにより,リスト1のリクエスト部分は以下のように変わります。
req.open('GET', 'http://www.example.com/contents.cgi?str=Good+Morning+AJAX');
ここで,もしcontents.cgiに不正なスクリプトが含まれていた場合は何が起こるでしょうか?
ユーザのブラウザに不正なスクリプトが送り込まれ,実行されてしまいます。
これがクロスサイトスクリプティングという攻撃です。クロスサイトスクリプティングについては何年も前から指摘されており解説しているサイトも多数存在するため,一般的なクロスサイトスクリプティングの解説については他サイトに譲ることにします。
脆弱性の原因
クロスサイトスクリプティングが発生した原因を考えてみましょう。
Ajaxから呼び出されるファイルであるcontents.cgiに,不正なスクリプトを仕込まれてしまったことが原因です。
つまり,contents.cgiでクロスサイトスクリプティング対策が行われていなかったということになります。このように不正なスクリプトを入力されたとしても,それをそのまま出力しないでエスケープ処理を行ってから出力することが,クロスサイトスクリプティング対策になります。

