SQL注入
悪いことだよ
もしくは、悪いことができる状態(セキュリティ上の欠陥、脆弱性)だよ
「SQL文の穴埋め部分に変な文章を入れて、おかしな動きにしてやるぜ」攻撃だよ
「SQLインジェクション」という言い方の方が一般的だと思うよ
簡単に書くよ
SQL注入(読:エスキューエルチュウニュウ、シークェルチュウニュウ 英:SQL injection)とは
「SQLインジェクション」のこと。
用語の中身としては
SQL文
(データベースに対する命令文)に対する【焼】肉【定】食型攻撃のこと
です。
もう少し真面目っぽく書くと
穴埋めになっているSQL文の穴埋め部分に作った人が意図しない内容を入れることによって、おかしな動きをさせること。もしくは、それが できるようになっている状態
です。
詳しく書くよ
順番に見ていきましょう。
まずは予備知識として
・データベース
・SQL
・SQL文(クエリ)
・SQLインジェクション
について説明します。
「そんなの説明されなくても知ってるよ!」な人は適当に読み飛ばしてください。
データベースは「データを入れておく箱」です。
突っ込んで考えると混乱するかもしれません。
何となくのフィーリングで理解してください。
SQLは「データベースと やり取りするときに使う言葉」です。
データベースにデータを入れるときは、データベースさんに「これを入れておいて」と命令します。
データベースからデータを取り出すときは、データベースさんに「こんなデータを取り出しておくれ」と命令します。
SQLは、そんな命令をするときに使う言葉です。
SQL文は「データベースに対する、SQLを使った命令文」です。
「クエリ」とも呼ばれます。
「SQL」と「SQL文」は違います。
あまり神経質になる必要はありませんが、区別できるように しておいてください。
SQLは「言語」です。
SQL文は「命令(文)」です。
例えば、そうですね。
ピヨ子さんがピヨ太君に日本語で「パン買ってこい!」と命令したとしましょう。
ピヨ子さんが人間、ピヨ太君がデータベースだとすれば「日本語」が「SQL」です。
「パン買ってこい!な命令」が「SQL文」になります。
以上を踏まえて、次にいきましょう。
例外はありますが、一般的なデータベースを使っているシステムでは、SQL文を使ってデータベースさんと やり取りします。
この、システムで使うSQL文ですが、同じような命令を何回もするのが普通です。
例えば、日記システムを考えてみてください。
「今日の日記を取ってきてよ」
「昨日の日記を取ってきてよ」
「一昨日の日記を取ってきてよ」
のように、同じような命令をする機会が少なくありません。
そこで、あらかじめ
「○○の日記を取ってきてよ」
のような ひな形を用意しておくのです。
そうすると、実際に命令するときは「○○」の部分を埋めれば済みますよね。
「今日」「昨日」「一昨日」あるいは「3月5日」のような日付を埋めれば、データベースさんは指定した日付の日記を取ってきてくれます。
データベースを使ったシステムというのは大概、このような工夫が成されています。
そして「○○」の部分に入る情報を外部から指定できるようにしておくことも珍しくありません。
日記システムを使う人が「昨日の日記が見たいな~」と言えば「○○」に「昨日」が入ります。
「一昨日の日記が見たいな~」と言えば「○○」に「一昨日」が入ります。
そのような作り方です。
SQLインジェクションは「『○○の日記を取ってきてよ』のような ひな形を使ったSQL文による命令において「○○」の部分に作った人が想定していないような内容を入れることにより誤作動を引き起こす攻撃」です。
あるいは、そのような攻撃を可能とするセキュリティ上の欠陥(脆弱性)を指している場合も あります。
「【弱】肉【強】食」と埋めてくれるのを期待して「【 】肉【 】食」という穴埋め問題を出したら「【焼】肉【焼】食」と埋められるジョーク(?)が ありますよね。
SQLインジェクションの構造は、それと同じです。
例えば、そうですね。
ピヨ太君が趣味でパン屋さんを始めました。
ピヨ太君のパン屋さんは注文制です。
「 」パンを「 」個、注文します。
のように書かれた注文用紙があります。
お客さまは、この注文用紙に
「アン」パンを「3」個、注文します。
や
「カレー」パンを「1」個、注文します。
のように書いてピヨ太君に渡すことでパンを買えます。
ピヨ太君のパン屋さんは、それなりに繁盛しました。
ピヨ太君は、あぶく銭で うっはうはです。
しかし、ピヨ太君の幸せな日々は長く続きませんでした。
ある日のことです。
イタズラ大好きアクマ君が やってきました。
アクマ君は注文用紙に以下のように書いてピヨ太君に渡しました。
「フライ」パンを「1」個、注文します。
なんと!
ピヨ太君は、パンの注文を受けていたはずなのに、フライパンを注文されてしまいました。
ピヨ太君にはフライパンを作る技術が ありません。
思わぬ事態にテンパって寝込んでしまいました。
これをSQL文に対してやるのがSQLインジェクションです。
あるいは、このような攻撃がやれるようになっている状態がSQLインジェクションです。
なんとなーくのイメージは湧いたでしょうか。
それでは次に、実際のSQL文を使ってSQLインジェクションの例を見てみましょう。
例えば、そうですね。
以下のようなSQL文があったとします。
select * from 社員テーブル where 社員番号='○○';
これは「社員テーブルから社員番号が○○のデータを取ってきてください」な命令です。
「○○」の部分には外部から指定した社員番号が入ります。
このSQL文を使うシステムは、仮に社員名簿システムとしましょう。
システムを使う人は、社員番号「1」の人の情報を見たいときは画面の社員番号欄に「1」と入力して「検索」ボタンを押します。
そうすると「○○」に「1」が入り、
select * from 社員テーブル where 社員番号='1';
のSQL文が実行されます。
あとは、結果がデータベースさんから返ってくるので、それを画面に表示すればOKです。
ちなみに、社員番号は1人につき1つです。
重複は ありません。
つまり
select * from 社員テーブル where 社員番号='○○';
のSQL文を実行して返ってくるデータは1件だけです。
当たり前ですね。
社員番号を指定してデータを取得しているのです。
データベースに保管されているデータは社員番号1つにつき1人です。
社員番号を指定してデータを取得すると、取得されるデータは必ず1件か0件(0件は見つからない場合)になります。
システムを作った人は、そう考えていました。
ところがですね。
イタズラっ子な社員さんが、社員番号欄に
1' or 社員番号 > '0
と入力してしまったのです。
そうすると、実際に実行されるSQL文は
select * from 社員テーブル where 社員番号='1' or 社員番号 > '0';
に なります。
プログラムを組む人は分かるでしょうが、このSQL文は「社員番号が1、もしくは社員番号が0より大きい人のデータを取ってきてください」な命令です。
取ってくる対象は「社員番号が1、もしくは社員番号が0より大きい人」です。
社員番号が0より大きい人なんて、たくんさんいますよね。
普通は1から採番するので、全社員が該当するかもしれません。
つまり、返ってくる結果は複数です。
たくさん あります。
これはシステムを作った人が想定していない事態です。
その結果、システムは止まってしまいました。
おーまいがっ。
このような
穴埋めSQLの穴埋め部分に作った人が想定外の内容を入れてやる攻撃、もしくは、それが可能になっている状態
がSQLインジェクションです。
今回の例ではデータの取得に対してイタズラをしましたが、やり方によっては、データを全部消したり、本来見られないはずのデータを見たりできます。
恐ろしい攻撃ですね。
以上を踏まえて
「SQLインジェクション」を日本語で言ってみました~な表現
が「SQL注入」です。
英語の「injection(インジェクション)」の意味は「注入」とか「注射」とかです。
「SQLインジェクション」の「インジェクション」を日本語で言ってみただけですね。
取り上げておいて なんですが、個人的には馴染みのない言い方です。
「SQLインジェクション」という言い方の方が一般的だと思います。
一言でまとめるよ
まぁ「SQL注入」って単語が出てきたら「SQL文
(データベースに対する命令文)の穴埋め部分に変なのを入れて おかしな動きにしてやるぜ攻撃、もしくは、それが可能な状態なんだな~」と お考えください。
おまけ
■検索してみる?






