どうも!ひよこSE(@PiyoOct)です。
SQLインジェクションっていう攻撃が出てきたけど、よくわからない。
ひとことでわかりやすく言えば、「変な文字を入れてデータベースに悪さをすること」です。
「画面でイタズラして変な文字を入力したら、データがおかしなことになったよ」的なイメージ。
データを全部引っこ抜いたり、改ざんしたり、消したり色々とできてしまいます。
SQLインジェクションとは、変な文字を入れてDBに悪さをすること
SQLインジェクションとは、変な文字を入れてDB(データベース)に悪さをすることです。
DBとは?
データベースって?
DB(データベース)は、データを入れる入れ物のことです。
社員番号とか、社員名みたいなデータを、保存しておくための入れ物の役割を果たします。
SQLとは?
それじゃあ、SQLって?
SQLは、データベースとデータをやり取りするのに使う言葉です。
SQLでデータを取ってきたり、登録したりすると思ってください。
ついでに言っておくと、
「インジェクション」=「injection」=「何かを入れること、注射」
の意味です。
SQLで、データベースに悪さする
まとめると、「データの入れ物であるデータベースとやりとりするSQLって言葉に、何か(悪いものを)を入れる」というのが、SQLインジェクションです。
悪いものを入れる目的は、DB(データベース)のデータを不正に取ってきたり、改ざんしたりすること。
え?それって悪いことじゃん。
SQLインジェクションを少しだけそれっぽく書くと、「データベースを不正に操作する(あるいは、操作できる状態)」なんて言ったりします。
「不正」なので、悪いことです。やったらダメです。
SQLインジェクションの例
SQLインジェクションの例として、IDとパスワードを入力してログインする画面があるとして、変な文字を入れてみます。
ログイン画面で変な文字を入れる例
まずは、普通のログイン画面。
それで、こんな感じのSQL文があって。
select * from ログインユーザ where ID = ” and パスワード = ”;
入力したID・パスワードと、ログインユーザテーブルのID・パスワードが一致するアカウントがあれば、マイページに移動するみたいな。
ふつうは、アカウントを作るときに決めたIDとパスワードを入力します。
select * from ログインユーザ where ID = ‘hiyoko’ and パスワード = ‘piyopiyo’;
ただ、悪知恵がはたらいたひよこSEは・・・。
IDには「’ or ‘A’ = ‘A」、パスワードには「’ or ‘X’ = ‘X」を入力しました。
ぱっと見では、なんのことやら。意味がわかりません。
しかし、実際に実行されるSQL文を書いてみると、次のようになります。
select * from ログインユーザ where ID = ” or ‘A’ = ‘A’ and パスワード = ” or ‘X’ = ‘X’;
変な文字でデータが全件取ってこれる
一見すると変な文字を入力していますが、よく考えてみてください。
太字部分の、” or ‘A’ = ‘A’と” or ‘X’ = ‘X’。
「”(空文字)または、’A’=’A'(AとAが等しい)」ですよね。
「または」は、前とうしろのどちらかが一致していればよし。
「AとAが等しい」というのは、とんちのような言い方だけど、どんな時だろうと常に成り立ちます。
あっ!どんな時だろうと条件が成立するから、このSQL文は、ログインユーザテーブルにあるデータを全件とってこれる!
その通りです!
仮にこのSQL文を実行したら、ログインユーザにあるデータ全件を取ってくることができます。
さて、ログインユーザというのは、IDとパスワードを入力して、1つに特定します。
ログインするユーザーが複数取れてくること、ましてや全件処理することは、想定されていません。
想定されていない結果をシステムで処理しようとして・・・。
そのままログイン後のマイページに行くかもしれないし、処理しきれなくてシステムダウンもありえます。
SQLインジェクションの対策は、エスケープ処理とテスト
それじゃあSQLインジェクションってどうやって対策するの?
SQLインジェクションの対策は2つ。
- 変な文字が入ってきたら、エスケープ(ただの文字に)すること
- プログラムを作ったときに、きちんとテストすること
変な文字って?
先ほどまでの話の「’ or ‘A’ = ‘A」が、まさに変な文字です。
「’ or ‘A’ = ‘A」 を、「SQL文の続き」とするのでなく「ただの文字」として処理するべきです。
ただの文字にするのを「エスケープ」なんて言ったりしますが、エスケープする文字として有名なのは「\(バックスラッシュ)」ですね。
イメージとしては、「\’ or \’A\’A = \’A」みたいな感じ。
う~ん。よくわからない。
エスケープすれば、回避できるんだな~っていうくらいで、OKです!
あとは、ちゃんとテストされしていれば、「あれ?SQLインジェクションできるぞ?」と、気づけるはずですからね(*´ω`)。
ある意味、プログラムのバグです。
これ以上は、大人の事情になりま・・・。 ゴホンゴホン
まとめ
SQLインジェクションとは、「変な文字を入れてデータベースに悪さをすること」です。
「画面でイタズラして変な文字を入力したら、データがおかしなことになったよ」的なイメージ。
変な文字を無効化したり、そもそもちゃんとテストしたりといった対策が必要です。
でないと、「データが全部引っこ抜かれたり、改ざんされたり、最悪の場合は消されたりするかもしれないんだな~」と思ってくださいまし(-_-;)。
コメント