「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典イメージぴよ画像「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

SQL注入

pointこの用語のポイント

point悪いことだよ

pointもしくは、悪いことができる状態(セキュリティ上の欠陥、脆弱性)だよ

point「SQL文の穴埋め部分に変な文章を入れて、おかしな動きにしてやるぜ」攻撃だよ

point「SQLインジェクション」という言い方の方が一般的だと思うよ

スポンサーリンク

簡単に書くよ

SQL注入(読:エスキューエルチュウニュウ、シークェルチュウニュウ 英:SQL injection)とは

「SQLインジェクション」のこと。
用語の中身としては

SQL文(データベースに対する命令文)に対する【焼】肉【定】食型攻撃のこと
です。
もう少し真面目っぽく書くと

穴埋めになっているSQL文の穴埋め部分に作った人が意図しない内容を入れることによって、おかしな動きをさせること。もしくは、それが できるようになっている状態
です。


image piyo

詳しく書くよ

順番に見ていきましょう。
まずは予備知識として

データベース
SQL
SQL文クエリ
SQLインジェクション


について説明します。
「そんなの説明されなくても知ってるよ!」な人は適当に読み飛ばしてください。

データベースは「データを入れておく箱」です。
突っ込んで考えると混乱するかもしれません。
何となくのフィーリングで理解してください。

SQL注入

SQLは「データベースと やり取りするときに使う言葉」です。

SQL注入2

データベースにデータを入れるときは、データベースさんに「これを入れておいて」と命令します。
データベースからデータを取り出すときは、データベースさんに「こんなデータを取り出しておくれ」と命令します。
SQLは、そんな命令をするときに使う言葉です。

SQL文は「データベースに対する、SQLを使った命令文」です。
クエリ」とも呼ばれます。

SQL注入3

「SQL」と「SQL」は違います。
あまり神経質になる必要はありませんが、区別できるように しておいてください。

SQLは「言語」です。
SQL文は「命令(文)」です。

SQL注入4

例えば、そうですね。
ピヨ子さんがピヨ太君に日本語で「パン買ってこい!」と命令したとしましょう。

SQL注入5

ピヨ子さんが人間、ピヨ太君がデータベースだとすれば「日本語」が「SQL」です。
「パン買ってこい!な命令」が「SQL文」になります。

SQL注入6

以上を踏まえて、次にいきましょう。

例外はありますが、一般的なデータベースを使っているシステムでは、SQL文を使ってデータベースさんと やり取りします。

この、システムで使うSQL文ですが、同じような命令を何回もするのが普通です。
例えば、日記システムを考えてみてください。

「今日の日記を取ってきてよ」
「昨日の日記を取ってきてよ」
「一昨日の日記を取ってきてよ」


のように、同じような命令をする機会が少なくありません。

そこで、あらかじめ

「○○の日記を取ってきてよ」

のような ひな形を用意しておくのです。
そうすると、実際に命令するときは「○○」の部分を埋めれば済みますよね。
「今日」「昨日」「一昨日」あるいは「3月5日」のような日付を埋めれば、データベースさんは指定した日付の日記を取ってきてくれます。

データベースを使ったシステムというのは大概、このような工夫が成されています。
そして「○○」の部分に入る情報を外部から指定できるようにしておくことも珍しくありません。
日記システムを使う人が「昨日の日記が見たいな~」と言えば「○○」に「昨日」が入ります。
「一昨日の日記が見たいな~」と言えば「○○」に「一昨日」が入ります。
そのような作り方です。

SQLインジェクションは「『○○の日記を取ってきてよ』のような ひな形を使ったSQL文による命令において「○○」の部分に作った人が想定していないような内容を入れることにより誤作動を引き起こす攻撃」です。
あるいは、そのような攻撃を可能とするセキュリティ上の欠陥脆弱性を指している場合も あります。

「【弱】肉【強】食」と埋めてくれるのを期待して「【 】肉【 】食」という穴埋め問題を出したら「【焼】肉【焼】食」と埋められるジョーク(?)が ありますよね。
SQLインジェクションの構造は、それと同じです。

例えば、そうですね。

ピヨ太君が趣味でパン屋さんを始めました。

SQL注入7

ピヨ太君のパン屋さんは注文制です。

「  」パンを「 」個、注文します。

のように書かれた注文用紙があります。

お客さまは、この注文用紙に

アン」パンを「3」個、注文します。



カレー」パンを「1」個、注文します。

のように書いてピヨ太君に渡すことでパンを買えます。

ピヨ太君のパン屋さんは、それなりに繁盛しました。
ピヨ太君は、あぶく銭で うっはうはです。

SQL注入8

しかし、ピヨ太君の幸せな日々は長く続きませんでした。

ある日のことです。
イタズラ大好きアクマ君が やってきました。

SQL注入9

アクマ君は注文用紙に以下のように書いてピヨ太君に渡しました。

フライ」パンを「1」個、注文します。

なんと!
ピヨ太君は、パンの注文を受けていたはずなのに、フライパンを注文されてしまいました。
ピヨ太君にはフライパンを作る技術が ありません。
思わぬ事態にテンパって寝込んでしまいました。

SQL注入10

これを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注入」です。

SQL注入11

英語の「injection(インジェクション)」の意味は「注入」とか「注射」とかです。
「SQLインジェクション」の「インジェクション」を日本語で言ってみただけですね。

取り上げておいて なんですが、個人的には馴染みのない言い方です。
「SQLインジェクション」という言い方の方が一般的だと思います。


image piyo2

一言でまとめるよ

まぁ「SQL注入」って単語が出てきたら「SQL文(データベースに対する命令文)の穴埋め部分に変なのを入れて おかしな動きにしてやるぜ攻撃、もしくは、それが可能な状態なんだな~」と お考えください。

一番上に戻るよ
スポンサーリンク
書籍画像064
書籍画像047

おまけ

■検索してみる?




書籍画像
わわわ説明術コラム
宣伝だよ
エンジニア育成現場の「失敗」集めてみた。 42の失敗事例で学ぶマネジメントのうまい進めかた
「分かった!」と思わせる説明の技術 知識ゼロの相手にも伝わるようになる本
あたえる人があたえられる