SE基本情報に出るIT用語

SQLインジェクションとは?変な文字を入れてデータベースに悪さをすること

どうも!ひよこSE(@PiyoOct)です。

SQLインジェクションっていう攻撃が出てきたけど、よくわからない。

ひとことでわかりやすく言えば、「変な文字を入れてデータベースに悪さをすること」です。

画面でイタズラして変な文字を入力したら、データがおかしなことになったよ」的なイメージ。

データを全部引っこ抜いたり、改ざんしたり、消したり色々とできてしまいます。

スポンサーリンク

SQLインジェクションとは、変な文字を入れてDBに悪さをすること

SQLインジェクションとは、変な文字を入れてDB(データベース)に悪さをすることです。

DBとは?

データベースって?

DB(データベース)は、データを入れる入れ物のことです。

データベースとはデータを入れる入れ物のこと

社員番号とか、社員名みたいなデータを、保存しておくための入れ物の役割を果たします。

SQLとは?

それじゃあ、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は・・・。

SQLインジェクションとは

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つ。

  1. 変な文字が入ってきたら、エスケープ(ただの文字に)すること
  2. プログラムを作ったときに、きちんとテストすること

変な文字って?

先ほどまでの話の「’ or ‘A’ = ‘A」が、まさに変な文字です。

「’ or ‘A’ = ‘A」 を、「SQL文の続き」とするのでなく「ただの文字」として処理するべきです。

ただの文字にするのを「エスケープ」なんて言ったりしますが、エスケープする文字として有名なのは「\(バックスラッシュ)」ですね。

イメージとしては、「\’ or \’A\’A = \’A」みたいな感じ。

う~ん。よくわからない。

エスケープすれば、回避できるんだな~っていうくらいで、OKです!

あとは、ちゃんとテストされしていれば、「あれ?SQLインジェクションできるぞ?」と、気づけるはずですからね(*´ω`)。

ある意味、プログラムのバグです。

これ以上は、大人の事情になりま・・・。 ゴホンゴホン

まとめ

SQLインジェクションとは、「変な文字を入れてデータベースに悪さをすること」です。

画面でイタズラして変な文字を入力したら、データがおかしなことになったよ」的なイメージ。

変な文字を無効化したり、そもそもちゃんとテストしたりといった対策が必要です。

でないと、「データが全部引っこ抜かれたり、改ざんされたり、最悪の場合は消されたりするかもしれないんだな~」と思ってくださいまし(-_-;)。

スポンサーリンク

コメント

タイトルとURLをコピーしました