SQL インジェクション概要
SQL インジェクションとは?
SQL インジェクションというのは、Web アプリケーションの脆弱性のひとつです。
開発者が意図しないようなパラメータを渡されることによって、情報の漏洩、データの改ざん等が行われます。
SQL インジェクションの例
具体的な例で考えてみましょう。
例えば次のようなログイン画面があったとします。よくある画面ですね。
画面の入力フィールドに、ユーザー名とパスワードを入力して、ログインボタンを押すとログインできるとします。
このとき、開発者は次のようなコードを書いたとします。
string sql = "SELECT COUNT(*) FROM Users WHERE UserName = '" + Request["UserName"] + "' " + " AND Password = '" + Request["Password"] + "'";
ユーザー名を確認するための SQL 文を組み立てているようです。
素直な普通の入力の場合 ~ 何も問題が無いように見える
ユーザーが、ユーザー名として Keisuke 、パスワードとして Password を入力すると、 作成される SQL 文は次のようになります。
sql = "SELECT COUNT(*) FROM Users WHERE UserName = 'Keisuke' AND Password = 'Password'";
Users テーブルに入力したユーザー名とパスワードがマッチするユーザーが存在する場合、COUNT(*) が 1 (以上) を返すでしょうから、 そのようなユーザーが存在すればログインを許可する、というわけです。
しかし、このようなコーディングに非常に危険なセキュリティホールが存在します。
上の例ではたまたま、ユーザーがお行儀良くユーザー名・パスワードのペアとして、"Keisuke"・"Password" を入力したために、 問題は発生していませんでした。
悪意のある入力 ~ 非常に危険
しかし、次のような入力が行われた場合どうなるでしょうか。
入力が、ユーザー名 "XXX"、パスワード "1'; DROP TABLE Users" 等とします。
すると、出来上がった SQL 文は次のようになります。
sql = "SELECT COUNT(*) FROM Users UserName = 'XXX' AND Password = '1'; DROP TABLE Users";
なんと、SELECT の後で DROP TABLE が埋め込まれてしまっています。
十分な権限がある状況でこのような SQL 文を実行されると、Users テーブルはドロップしてしまいます。
つまり、SQL インジェクションとは・・・
このように、悪意のある不正な入力を行うことによって任意の SQL 文を実行できるようになるタイプのセキュリティホール、脆弱性のことを、 SQL インジェクション (SQL Injection) といいます。
非常に危険なセキュリティホールですので、開発者はプログラムを開発するときには十分この点について配慮しなければなりません。