業務用Webアプリケーションは、多量のデータを扱うことが多く、データベースとの連携がなされることが多い。データベースと連携したWebアプリケーションには、他のWebアプリケーションにはない特有のセキュリティ問題がある。データベースと連携したWebアプリケーションのセキュリティ問題のキーワードは「SQLコマンドインジェクション」である。 前回記事ではOSコマンドインジェクションについて取り上げた。cgiを通して外部からシステムOSのコマンドを直接入力されてしまう問題である。今回話題にするのはSQLコマンドインジェクションである。 多くのデータベースでは、SQL(Structured Query Language:構造化問い合せ言語)を用いてデータベースの内容を処理する。このSQLコマンドをcgiを通して外部から直接送り込まれる、つまりデータベース内容の不正操作のことがSQLコマンドインジェクションである。 SQLコマンドインジェクションの原理を、可能な限り簡単にして説明しよう。データベースのデータ形式として、次のような形式でデータの並ぶのユーザIDとパスワードの対照表を考える。ID, passwordつまり、最初の欄はユーザID、次の欄はパスワードである。実際のデータベースの内容はsatoh, sukoshinagipasswordsuzuki, kaidokudekinaipasswordという具合になっている。もう少し詳しくこのデータベースファイルの形式を説明すると、IDとpasswordの区切りはコンマと半角スペース、passwordと次のデータのIDとの区切りは改行コードである。ここで改行コードを仮に↓で表すと、このデータベースの内容はsatoh, sukoshinagipassword↓suzuki, kaidokudekinaipassword↓と表すこともできる。 このデータベースに新たにデータを加えるcgiがあったとしよう。WebからユーザIDとして「yamamoto」、パスワードとして「$&*%password」が入力された場合にはデータベースの内容は、satoh, sukoshinagipassword↓suzuki, kaidokudekinaipassword↓yamamoto, $&*%password↓という具合に、入力されたデータが最後尾に付け加えられる。 ところがこのcgiに、ユーザIDとして「akechi」、パスワードとして「pass1↓itoh, pass2」というデータが入力されると、これを最後尾に付け加えたデータベースの内容は、satoh, sukoshinagipassword↓suzuki, kaidokudekinaipassword↓yamamoto, $&*%password↓akechi, pass1↓itoh, pass2↓となる。記号「↓」を、本来通り改行に直して表記するとsatoh, sukoshinagipasswordsuzuki, kaidokudekinaipasswordyamamoto, $&*%passwordakechi, pass1itoh, pass2となる。officeoffice@ukky.nethttp://www.office.ac/(詳しくはScan本誌をご覧ください)http://shop.vagabond.co.jp/m-ssw01.shtml