真面目に書くと穴埋めになっているSQL文の穴埋め部分に、作った人が意図しない内容を入れることによって、おかしな動きをさせること。それができるようになっている状態です。詳しく書くよ順番に見ていきましょう。データベースは「データを入れておく箱」ね。突っ込んで考えると混乱するかもしれません。何となくのフィーリングで理解してください。SQLは「データベースとやり取りするときに使う言葉」です。データベースにデータを入れるときは、データベースさんに対して「ちょっと、これを入れておいて」と命令します。反対にデータベースからデータを取り出すときは、データベースさんに対して「ちょっくら、こんなデータを取り出しておくれ」と命令します。SQLは、そんな命令をするときに使う言葉です。SQL文は「SQLを使ったデータベースに対する命令文」です。「クエリ」とも呼ばれます。「SQL」と「SQL文」は違います。神経質になる必要はありませんが、区別できるようにしておいてください。SQLは「言語」です。SQL文は「命令(文)」です。ピヨ子さんがピヨ太君に日本語で「パン買ってこい!」と命令したとしましょう。ピヨ子さんが人間、ピヨ太君がデータベースだとすれば「日本語」が「SQL」です。「パン買ってこい!な命令」が「SQL文」になります。それを踏まえて、次にいきましょう。例外はありますが、一般的なデータベースを使っているシステムでは、SQL文によってデータベースさんとやり取りをしています。この、システムで使うSQL文ですが、同じような命令を何回もするのが普通です。日記システムを考えてみてください。「今日の日記を取ってきてよ」「昨日の日記を取ってきてよ」「一昨日の日記を取ってきてよ」のように、同じような命令をする機会が少なくありません。そこで、あらかじめ「○○の日記を取ってきてよ」のような、ひな形を用意しておくのです。「3月5日」のような日付を埋めれば、データベースさんは指定した日付の日記を取ってきてくれます。データベースを使ったシステムというのは、大概、このような工夫が成されています。「○○」の部分に入る情報を、外部から指定できるようにしておくことも珍しくはありません。日記システムを使う人が「昨日の日記が見たいな~」と言えば「○○」には「昨日」が入りますし「一昨日の日記が見たいな~」と言えば「○○」には「一昨日」が入るような作り方です。ここまでが前振りです。「○○の日記を取ってきてよ」のようなひな形を使ったSQL文による命令において「○○」の部分に作った人が想定していないような内容を入れることにより、誤作動を引き起こす攻撃が「SQLインジェクション」です。そのような攻撃を可能とするセキュリティ上の欠陥(脆弱性)を指す場合もあります。ピヨ太君は、趣味でパン屋さんを始めました。ピヨ太君のパン屋さんは注文制です。ように書かれた注文用紙があります。お客さまは、ここに「アン」パンを「3」個、注文します。「カレー」パンを「1」個、注文します。ように書いてピヨ太君に渡すことによって、パンを買うことができるのです。ピヨ太君のパン屋さんはそれなりに繁盛しました。ピヨ太君はあぶく銭でうっはうはです。ピヨ太君の幸せな日々は長く続きませんでした。ピヨ太君があぶく銭に浮かれていたある日のことです。イタズラ大好きアクマ君がやってきました。アクマ君は、注文用紙に以下のように書いてピヨ太君に渡しました。「フライ」パンを「1」個、注文します。なんと!ピヨ太君はパン屋さんで、パンの注文を受けていたはずなのに、いつの間にかフライパンを注文されていました。ピヨ太君にはフライパンを作る技術がありません。思わぬ事態にテンパって寝込んでしまいました。これをSQL文に対して行うのが、SQLインジェクションです。このような攻撃が行えるようになっている状態のことを指す場合もあります。なんとなーくのイメージは湧いたでしょうか。それでは次に、実際のSQL文を使ってSQLインジェクションの例を見てみましょう。以下のようなSQL文があったとします。社員番号='○○';これは「社員テーブルから社員番号が○○のデータを取ってきてください」な命令のSQL文です。「○○」の部分には外部から指定した社員番号が入ります。このSQL文を使うシステムは、仮に社員名簿システムとしましょう。システムを使う人は、社員番号「1」の人の情報を見たいときは画面の社員番号欄に「1」と入力して「検索」ボタンを押します。社員番号='1';のSQL文が実行されます。あとは、結果がデータベースさんから返ってくるので、それを画面に表示すればOKです。ちなみに、社員番号は一人につき一つで、重複はありません。社員番号='○○';のSQL文を実行して返ってくるデータは1件だけです。社員番号を指定してデータを取得しているのです。データベースに保管されているデータは社員番号一つにつき一人です。よって、社員番号を指定して取得した際のデータは、必ず1件か0件(0件は見つからない場合)になります。システムを作った人は、そう考えていました。入力してしまったのです。プログラムを組む人は分かるでしょうが、このSQL文は「社員番号が1、もしくは社員番号が0より大きい人のデータを取ってきてください」な命令です。取ってくる対象は「社員番号が1、もしくは社員番号が0より大きい人」です。社員番号が0より大きい人なんて、たくんさんいますよね。普通は1から採番するので、全社員が該当するかもしれません。返ってくる結果は複数です。これはシステムを作った人が想定していない事態でした。その結果、システムは止まってしまいました。このように、穴埋めSQLの穴埋め部分に作った人が想定外の内容を入れてやる攻撃、もしくは、それが可能になっている状態がSQLインジェクションです。今回の例ではデータの取得に対してイタズラをしましたが、やり方によっては、データを全部消したり、本来見られないはずのデータを見たりできます。個人的にはSQLインジェクションはバグ(プログラムのおかしいところ)の仲間だと考えています。穴埋め部分の「○○」に入る値の入力チェックや特殊文字の置換をきちんとやれば、防げる問題ですよ。一言でまとめるよまぁ「SQLインジェクション」って単語が出てきたら「SQL文の穴埋め部分に変なのを入れておかしな動きにしてやるぜ攻撃、もしくは、それが可能な状態のことなんだな~」と、お考えください。マコト)1979年1月1日生まれ。イギリス生まれの日本育ち。システム開発系の仕事を中心に10年以上IT業界に生息しているが、実は横文字と専門用語が苦手。同業者と話すときは「日本語で喋れ!日本語で!」と心の中で毒づくも、自分も専門家という立場なので大っぴらには文句を言えない日々を送る。Service」Webサイト)をご覧ください。「どんなお仕事やってるの?」「業務経歴書が欲しいな~」「スキルシートを送ってよ」等々、お仕事関係で過去に必要になったプロフィールはすべて公開しています。「こんな情報も知りたいんだけど」なご要望をいただければ、随時追記いたします。>>※本サイトは「何となく分かる」を目的としているため、正確性に欠ける表現がございます。具体的かつ正確性の高い情報を求めている方は、こそっとお戻りください。具体的に書くとレンタルサーバ会社さんと契約することによって、主にインターネット経由で使わせてもらえるサーバのことです。Term」の実行ファイルです。予備知識から行きましょう。有限会社リムアーツさんが作って売っているメールソフトです。メールソフトは「メールを見たり送ったりするときに使うソフト」ね。「ドロップダウンリスト(プルダウンメニュー)」のこと。光通信をするときに使う線のことです。「光通信」は「データを光信号に変換して行う通信方式」ね。この光通信をするときに使う回線が「光回線」です。「同じコードを何度も書くな!」原則のこと。細かく書くとプログラミングにおいて「同じ処理をいろんな場所に書くんじゃねぇ!」な考え方のことです。UNIX系のOS(LinuxとかMacとか)で使えるコマンド「head」の本体ファイルです。※このページの説明は「/bin/head」の説明と、ほとんど同じです。無線LANアダプタの親戚。ユーザを追加するときに使うコマンドです。UNIX系(LinuxとかMacとか)で使えます。オプションは結構あります。コンピュータの中に疑似的に作った「なんちゃって」な環境(何かをするための「場」)のことです。「仮想」+「環境」で「仮想環境」です。仮想は「なんちゃって」ね。OSI参照モデルにおけるレイヤ3(ネットワーク層)に分類される情報を見て行き先を振り分けてくれるスイッチのこと。オーディオマネージャ」の実行ファイルです。予備知識から行きましょう。