最近、ある会社のクレジットカード情報が流出したっていうニュースを見たんですが、あれって何が原因だったんですか?


どうやらSQLインジェクションの脆弱性が原因だったみたいね。


SQLいんじぇくしょん?


SQLインジェクションの脆弱性があると、データベースを不正に操作されてしまうのよ。


簡単な例で説明するわね。
例えば、ユーザIDとパスワードを入力して、該当ユーザの顧客情報を取得するには、こんな感じのSQL文を実行するのだけれど。
SELECT * FROM 顧客テーブル WHERE user_id = ‘$user_id’ AND pass = ‘$pass’
ユーザIDの変数が’$user_id’、パスワードの変数が’$pass’ですよね。
一見、問題なさそうですが。


SQL構文としては問題ないのだけれど、Webアプリケーションに脆弱性があった場合、不正なSQL文を実行できてしまうの。例えば、パスワードに以下の文字列を入力するとした場合、顧客テーブルのすべてのデータを削除されてしまうのよ。
‘; DELETE FROM 顧客テーブル WHERE ‘A’ = ‘A
sqlインジェクション
※クリックで拡大できます。

;(セミコロン)の後に記述したSQL文が2つ目のSQL文として解釈されてしまうの。この現象がSQLインジェクションよ。ちなみに、インジェクションは「挿入」という意味よ。


この脆弱性を利用すれば、データベース内の個人情報も取得できてしまいますね。根本的な解決策ってあるんですか?


根本的に解決するには、サービス提供側で対策が必要ね。Webアプリケーション実装時における対策は、以下の2つがあるわよ。
・バインド機構(バインドメカニズム)を利用する。
・メタキャラクタのエスケープ処理を行う。
聞いたことない用語です。。


えーと、まずバインド機構は、あらかじめSQL文の雛形を用意しておいて、変数を表す記号(プレースホルダ)に値(バインド値)を割り当てて、SQL文を実行できる機能のことよ。


バインド値は、SQLの一部として解釈されないから、SQLインジェクションの脆弱性は発生しないわ。


バインド機構を利用できない場合は、メタキャラクタのエスケープ処理も有効よ。
メタキャラクタは、特別な意味を持たせた文字(例:「’」「\」)のことで、エスケープ処理はメタキャラクタを別の文字に置換することよ。(例:「\」→「\\」)


ちなみに、エスケープ処理で無害化することを「サニタイジング」というから覚えておいて。


はい!
Webアプリケーション実装時は、十分に気を付けないといけないですね。


そうね。Webアプリケーション実装以外の対策としては、データベースのアカウントの持つデータベースアクセス権限を必要最小限にしておくことも重要よ。


ユーザ側ができる対策ってあるんですか?


まぁ、むやみに個人情報は入力しないことね。
海外の怪しいサイトとかは特にね!