「ページを見ただけで感染する」。このようなニュースを読んで怖さを感じた人は多いだろう。なぜそのようなことが起きるのか? 理由を知っておけば、巧みなネット地雷原を避けることができるはずだ。
これまでにオンライン・ムック「スパム時代のサニタイズ開発手法」では、CGIスクリプトにおけるセキュリティホールについて解説してきた(関連リンク)。今回の記事は、CGIスクリプトにおけるタグ扱いについて触れていく。
CGIスクリプトの中でどのようにHTMLタグを扱えばいいのか、表現力を高めることでリスクが伴う現状に、どのような対策の選択肢があるのか? それらを明らかにしていこう。
Webでは、「多機能さに走るとリスクと裏腹になる」。インターネットが不特定多数からのアクセスを許容しているからにほかならない。このため、機能実装は十分に吟味しなければならないのだ。
ただし、閉鎖的であればリッチなアプリケーション構築ができず、リッチにしていけば幾重ものセキュリティ対策を講じる必要性を意味する。ここで言うリッチとは、テキストだけではなく、画像や動画などを扱う表現力のことだ。さらにサービス指向が進めば、オンラインショッピングサイトで見られるようなコンテンツマネジメントのシステム化が考えられる。
それではリッチにしながら対策を講じる手法はないのだろうか? これこそが、多くのインターネットサービスが課題とするものの一つだろう。
単純なものとしてインターネット上で見掛ける掲示板を例にしよう。ここでは、ユーザーが書き込みをすると、その内容がページに反映してコミュニケーションが成り立つようシステム化されている。インターネットが登場した当時からこのサービスが存在するが、現在でも現役のコミュニティーとして活躍している。この掲示板に限らず、Webブラウザからユーザーが入力した文字内容をページの一部として表示する仕組みは、ブログなど多くのインターネットサービスで利用されているものだ。
このようにサーバが情報を受信することで情報交換が成立しているが、常にリスクとの背中合わせであることを忘れてはならない。いたずらに恐れることはないが、地雷原があるところを知っておかなければならない。
ホームページの記述言語であるHTML(HyperText Markup Language)やXHTML(eXtensible HTML)では、タグと呼ばれる記法によって文字装飾や画像表示などができるようになっている。
HTMLやXHTMLは、W3C(World Wide Web Consortium)と呼ばれる団体によって策定が行われているものだ。HTML自体には4.01まで改訂が進んだが、その後、XHTMLへと移行推奨されているためにHTMLは1999年でバージョンアップが停止している。XHTMLはドラフト(草案)の2.0が最新バージョンだ。下記のサイトで仕様書を参照することができる。
タグは、「<」で始まり、「>」で終わる文字列であり、ブラウザはタグを認識すると、タグ内容に応じた処理を行う決まりがある。タグの機能は実に多種多様であり、概して次のような処理が可能だ。
また、タグの拡張として、JavaScriptやVBScript、そしてCSS(Cascading Style Sheets)といったスクリプト言語や拡張を併用することもできる。タグはブラウザのバージョンアップとともに拡張し、ホームページ制作に表現力の豊かさを与えてくれた。しかし、このタグがCGIスクリプトなどのWebサーバアプリケーションでは、思わぬセキュリティホールとなることがあるため要注意なのだ。
CGIスクリプトの動作において、ユーザーからタグの入力ができてしまうと、プログラムが開発者の期待した動きをしないことがある。「Cookieは悪くない――潜む漏えいパターンの真実」でも触れた通りだ。
悪意のある第三者はこれらを逆手に取り、不正な動作を仕掛けようとする。CGIスクリプトなどのWebアプリケーションにおいて、このようなセキュリティ上の脆弱性を「クロスサイトスクリプティング」(XSS:Cross Site Scripting)と呼ぶ。CGIスクリプトが設置されているサーバの枠組みを超え、複数のサイトにまたがって動作してしまうのでこのように呼ばれるようになった。
XSSは2000年ごろから登場し、5年後の現在でも脆弱性のニュースで話題になることがしばしばある。Web開発者の間でもXSSは認識されてきているが、依然としてこの手の脆弱性が問題となる背景には、攻撃パターンが無数なことにあるだろう。このため、開発者も納期の短いスケジュールでは、想定パターン以外にも検証するといったテストが十分に行えないのが実情だ。
次に、XSSによる例を示す。
Copyright © ITmedia, Inc. All Rights Reserved.