SQLインジェクション入門:仕組みと対策
データベースとSQL
この回でやること
アプリはデータをどこに、どんな形でしまうのか。そしてなぜプログラムはSQLという言葉でデータベースに話しかけるのかを、表・行・列から確かめます。
- 読む 約 7 分
- 最後にクイズ 1 問
このレッスンで学ぶこと
データベースは、消えては困るデータを表の形でしまう専用の置き場です。この回では、そこへプログラムがSQLという言葉でどう話しかけるのかを、表・行・列から確かめます。
読み終えるころには、アプリの裏で動く1行のSQLが何をしている命令なのかを、自分の言葉で言えるようになります。
データベースは、消えては困るものを預かる場所
プログラムが変数に持つ値は、処理が終われば消えます。しかし利用者の名前やパスワードは、次にログインするときも残っていなければなりません。この「消えては困るもの」を専用にあずかるのがデータベースです。アプリ本体とは別のところに置かれ、電源が切れても中身は残ります。
多くのデータベースは、データを表の形でしまいます。表計算ソフトの1枚のシートを思い浮かべると近いです。この章で最後まで付き合うusersという表は、こんな中身をしています。
| name | password | role |
|---|---|---|
| tanaka | tanaka-pass | member |
| admin | s3cret-admin | admin |
| o'brien | obrien-pass | member |
横1本が1人分の記録で、これを行と呼びます。ここでは自分自身であるtanaka、管理者のadmin、名前にシングルクォートを含む正規の利用者o'brienの3人がいます。縦の並びが列で、name・password・roleという項目名が付いています。どの行も同じ列を持つ、という規則正しさが表の特徴です。
アプリはSQLで話しかける
アプリがこの表から何かを取り出したいとき、日本語で頼むわけにはいきません。データベースが受け取れる言葉で命令を書きます。それがSQLです。次の1行は「users表からnameとroleを取り出せ」という命令です。
SQL クエリ
SELECT name, role FROM usersSELECTが「取り出せ」、name, roleが「この列を」、FROM usersが「この表から」にあたります。取り出すだけでなく、行を足す・書き換える・消すといった指示も、すべてこのSQLという言葉で書いて渡します。どの行を対象にするかを絞り込むWHEREは、次回に読み方を学びます。
変数はプログラムが動いている間だけの入れ物で、閉じれば中身は消えます。何人分ものデータを長く残し、必要な行だけを素早く探すのは、専用のしくみに任せたほうが確実です。その専用のしくみへ指示を出す共通の言葉が、SQLです。
データベースは、渡されたSQLを命令として実行します。その命令が書いた人の意図どおりかどうかは判断しません。ここが後の章で効いてきます。意図ではなく、届いた文字列そのものが実行されます。
手を動かすなら、自分が触っているアプリのコードからSELECTやqueryという文字列を探してみてください。データベースに話しかけている1行が必ず見つかります。その1行が、これから読み解いていく命令文です。