CGIスクリプトなどのWebアプリケーションでは、タグを特殊文字としてブラウザに機能させないことが重要だ。その機能は無効化しておくことで防御が可能なのだ。
この処理のことを「サニタイズ」と呼ぶ。
サニタイズ(Sanitize)は直訳すれば「消毒する」という意味だ。この言葉自体は、比較的最近になってから使われるようになったため、読者には親しみがないかもしれない。しかし、1997年前後のCGIがブームとなった当時から、「タグの無効化」という仕組みは存在していた。特に、掲示板システムではタグの無効化は必須となっていたテクニックなのだ。
そうとはいえ、タグの無効化だけでWebアプリケーションのセキュリティホール(脆弱性)がすべてなくなるというわけではない。あくまでサニタイズはセキュリティホール(XSS)対策のための一手段にすぎないことを認識しておいてほしい。予期せぬ情報漏えいを防ぐための、最後の切り札と考えておくのがよいだろう。
デベロッパーのためにもう少し突っ込んだ見解も示しておこう。
タグの無効化とひと口に言っても、Webアプリケーションの開発言語によって記述方法が異なっている。
CGIスクリプトで多用されているPerl言語では、比較的簡単に記述することができる。以下にサンプルコードを示す。詳細を知りたい読者はソースコードを見てほしい(関連リンク)。
# タグの無効化
$value =~ s/&/&/g;
$value =~ s/</</g;
$value =~ s/>/>/g;
$value =~ s/"/"/g;
$value =~ s/'/'/g;
Perlではコメントを「#」で始まる一行で記述することができる。コメントはプログラムの動作には何ら影響を与えないものだが、ソースコードの可読性を良くするために残すものだ。コメントが適切に付けられたコードは、メンテナンスが必要なときに読みやすいプログラムとなる。
Perlでは変数を「$」で始まる文字列で利用することができる。プログラムにおいて変数はいわば一時的なメモリ領域である。
「s///」を使うことにより、文字の置換が行えるのだ。
変数 =~ s/文字1/文字2/g;
上記のような書き方をすると、変数に格納されている文字列を先頭から走査し、「文字1」を探して「文字2」に置き換えるという処理を行う。
文字1と文字2は文字列でも構わず、「s///」の末尾に「g」(globalの略)が付加されているのは、置換作業を1回だけではなく、置換対象文字がなくなるまで行うという意味だ。
実際の処理はタグの置換というシンプルなものだが、プログラム本来の処理ではないため意外と見落とされやすい。
Copyright © ITmedia, Inc. All Rights Reserved.