SQLインジェクションやクロスサイトスクリプティングは、Webアプリケーションセキュリティに携わる人たちの間では広く語られていた用語であり、その危険性について以前から識者たちはたびたび警告を発していた。しかしながら、ファイアウォールやIDS(不正侵入検知システム)といったネットワークセキュリティに携わるネットワークエンジニアたちの間でこれらの危険性が十分に語られてきたとはいえない。
Webアプリケーションの脆弱性に対する防御はネットワークエンジニアの範疇(はんちゅう)ではなく、Webアプリケーション開発者の仕事であるという意識があったからではないだろうか。事実、これらの脆弱性に対してIDSやIPS(不正侵入防御システム)といった既存のネットワークセキュリティ製品は極めて無力である。その結果、Webアプリケーションの脆弱性に対する対策は、Webアプリケーション開発者たちの努力に委ねられていった。
Webアプリケーションの脆弱性を生み出さないために、Webアプリケーション開発者の間ではセキュアプログラミングという概念が浸透していった。この概念には、セキュアなプログラムを作成するためのあらゆる方策が含まれているが、よくいわれることはユーザーからの入力データをそのままプログラムに受け渡すのではなく、一度必ず浄化作業(サニタイジング)を行うという考え方である。
例えば、プログラムやコマンドで意味を持つメタキャラクタ(メタ文字:\、[、]、|、$、*など)の入力を禁止し、正規表現にて入力文字列のパターンを限定することによって入力データの浄化を行う。以下に非常に簡単なPerl用のサニタイジング関数を2つ示す。入力された文字に対していずれかを実行すればサニタイジングがなされる。
#! 不正文字のリストを使用したネガティブフィルタ sub FilterNeg { local( $fd ) = @_; #! <,>,",',%,;,),(,&,+ の文字列を削除する $fd =~ s/[\<\>\"\'\%\;\)\(\&\+]//g; return( $fd ) ; } #! 合法文字のリストをベースにしたポジティブフィルタ sub FilterPos { local( $fd ) = @_; #! 英数字およびスペース以外を削除する $fd =~ tr/A-Za-z0-9\ //dc; return( $fd ) ; }
セキュアプログラミングは、Webアプリケーションの脆弱性を防ぐ唯一の有効な手段であると考えられてきた。しかし、Webアプリケーション開発者たちによる手作業での努力に依存するこのやり方はいくつかの弱点をはらんでいる。
セキュアプログラミングにはノウハウが必要となる。プロジェクトに参加する開発者がすべて優秀な開発者であるなら話は別だが、Webアプリケーション開発には複数の開発者たちがかかわるものであるし、通常はスキルにばらつきがある。1人の優秀な開発者のスキルをプロジェクト全員に伝達することにも限界があり、その結果セキュアプログラミングのスキルを持つ開発者がソースコードのレビューとテストを繰り返すことになる。
ソースコードのレビューとテストを繰り返す作業は、作成するプログラムが大きなものであればあるほど膨大な作業量となっていき、開発工数の増加によるコストがのしかかってくる。
Webアプリケーション開発者が考慮しなければならないのはセキュリティだけではない。機能とパフォーマンスを追求しながら、同時にセキュアなアプリケーションを、限られたリソース、限られた工数の中で完成させていくことは簡単ではない。いくつかの国内有名サイトでWebアプリケーションの脆弱性を原因とした情報漏えいが発生している現実を見ても、Webアプリケーション開発者の努力に依存する従来の手法に限界が示されている。
余談になるが、このようなWebアプリケーション開発者の努力にもかかわらず、いざWebアプリケーションの脆弱性による情報漏えいが発生した際の、Webアプリケーション開発者に集まる非難はフェアではない。ネットワークエンジニアたちは責任を逃れ、エンドユーザーからは責任追及、IT業界からの非難のまなざし。必ずしもWebアプリケーション開発者によるサボタージュによって問題が発生したとはいえないにもかかわらず、この扱いが妥当であるとはいい難い。本連載で紹介するWAFがWebアプリケーション開発者たちの助けとなり、過度な非難から免れる手段となれば幸いである。
Copyright © ITmedia, Inc. All Rights Reserved.