サイバーセキュリティお嬢様「SQLいんじぇくしょん...ってなんですの？」

# ある日
サイバーセキュリティお嬢様（以下CSお嬢様）「じいや、大変ですの！」

じいや「どうしたのですかな、お嬢様」

CSお嬢様「昨日こんなことがあったんですのよ↓」

> CSお嬢様「わたくし、最近はサイバーセキュリティについて学んでおりますのよ」
> 幼馴染お嬢様「まあ素敵ですこと！きっと、DDoS/SQLインジェクション/クロスサイトスクリプティングあたりはお茶の子さいさいでしょうね」
> CSお嬢様「も、もももももももももちろんですわ！」
> CSお嬢様「（まずいですわ、DDoSしか分かりませんわ...！）」

CSお嬢様「...ということなんですの」

じいや「なるほどですな」

じいや「では今回はSQLインジェクション、次回はクロスサイトスクリプティングについて勉強していきましょうぞ」

CSお嬢様「わたくし、頑張りましてよー！」

# データベースとは
じいや「まずはDB（データベース）について学びましょうか」

CSお嬢様「データベースって、なんだか情報が集まったもの、みたいなイメージがありますわ」

じいや「だいたい合っておりますが」
じいや「**検索したり蓄積しやすいようにフォーマットされた情報の集まり**、」
じいや「の方がより正しい表現になりますかな」

CSお嬢様「私のデータベースは無限大ですわ！」

じいや「あえて突っ込みはいたしませんぞ？」

# SQL文（クエリ）とは
じいや「次にSQL文について説明いたしますぞ」

CSお嬢様「SQL？」

じいや「SQLとは」
じいや「Structured Query Languageの略で、訳すと**構造化照会言語**ですな」

CSお嬢様「わたくし、じいやが何を言っているのかさっぱりでしてよ」

じいや「データベースには、階層型/ネットワーク型/リレーショナルの３種類あり」
じいや「SQLはリレーショナルデータベースのデータを操作するための言語なのです」
じいや「**そのデータを操作する時に出す命令**のことをSQL文、またはクエリ（query）というのですぞ」

CSお嬢様「リレーショナルデータベースってどんなデータベースなんですの？」

じいや「Excelのような**表形式のデータベース**ですぞい」
じいや「例えばこんな感じですぞ↓」

`SampleList`
| ID | Name | Gender | PhoneNumber |
|:-:|:-:|:-:|:-:|
| 0001  | 佐藤太郎  |  男 |  090-xxxx-xxxx |
| 0002  | 鈴木花子  |  女 |  070-xxxx-xxxx |
| 0003  | 田中次郎  |  男 |  080-xxxx-xxxx |

じいや「ついでにSQL文の例も提示しておきましょうか」

```SQL:SQL文の例
SELECT * FROM SampleList WHERE Gender='男';
```
じいや「このSQL文を実行するとこうなりますぞ↓」

`SampleList`
| ID | Name | Gender | PhoneNumber |
|:-:|:-:|:-:|:-:|
| 0001  | 佐藤太郎  |  男 |  090-xxxx-xxxx |
| 0003  | 田中次郎  |  男 |  080-xxxx-xxxx |


CSお嬢様「具体例があると一気にイメージしやすくなったわ、ありがとうじいや」

じいや「お礼には及びませんぞ、お嬢様」

# SQLインジェクションとは
じいや「それでは本題のSQLインジェクションについて話していきますぞ」

じいや「SQLインジェクションとは」
じいや「英語表記だと**SQL injection**、injectionは**注入**という意味ですぞ」

CSお嬢様「それだけじゃ何を言っているのか分からないわ」

じいや「まあまあ慌てないでお聞きくださいですじゃ」
じいや「例えばこんなログインフォームがあった場合↓」

| User ID | Password |
|:-:|:-:|
|   |   |

CSお嬢様「よくある形ですわね」

じいや「例えばUser IDとPasswordの組み合わせが」
じいや「`User ID: ojosama / Password: 123456abc`だった場合、」

| User ID | Password |
|:-:|:-:|
|  ojosama | 123456abc  |

じいや「本来はUser ID、Password両方分かっていないとログインできませんが」
じいや「ログインフォームのPassword欄にこんな感じで入力すれば↓」

| User ID | Password |
|:-:|:-:|
|  ojosama | 1' OR '1'='1  |

じいや「なんとログインできてしまうことがあるのですぞい」

CSお嬢様「**一体なんでですのー？**」

じいや「通常はこのような命令がされるのですが↓」

```SQL:SQL文の例2
SELECT * FROM LoginList WHERE UserID='ojosama' AND Password='123456abc';
```

じいや「先ほどの不正なログインの仕方をされた場合のSQL文はこのようになるのです↓」

```SQL:SQL文の例3
SELECT * FROM LoginList WHERE UserID='ojosama' AND Password='1' OR '1'='1';
```

じいや「ここで注目してほしいのは`Password='1' OR '1'='1'`の部分ですぞ」

CSお嬢様「**1=1になるのは当たり前**ですわよね？」

じいや「今日のお嬢様も冴えておりますな」
じいや「その通りですぞ」

じいや「1=1と、**絶対的に条件を満たす文**を注入（injection）することで」
じいや「SQLインジェクションを成立させてしまうことができるのです」

CSお嬢様「なんとなく分かりましたわ」

# SQLインジェクションを防ぐには
CSお嬢様「怖いですわぁー！個人情報ダダ漏れじゃあないですの！！」
CSお嬢様「一体どうすればいいんですのー？」

じいや「以下のような対策が考えられますぞ」

:::note info
・エスケープ処理（バインド機構）を行う
・WAF（Web Application Firewall）を導入する
:::

じいや「エスケープ処理とは」
じいや「例えば、`1' OR '1'='1`という入力を以下のようにすることで、**命令ではなく文字として入力されるようにする処理**ですぞい」
```SQL:SQL文の例4
SELECT * FROM LoginList WHERE UserID='ojosama' AND Password='1'' OR ''1''=''1';
```
CSお嬢様「つまり、攻撃が無効化される...ってことですのね？」

じいや「その通りですぞ」
じいや「他にもバインド機構と呼ばれる仕組みを使うことでSQLインジェクションを防ぐことができますぞい」


CSお嬢様「じゃあワフ、ってなんですの？」

じいや「WAFとは」
じいや「Webアプリケーションのレベルで動作するファイアウォールのことですぞい」

CSお嬢様「もう！何がなんだかさっぱりですわぁー！」

じいや「お嬢様、今のところは**Webサイトと攻撃者の間に立って、攻撃を守る壁**のようなもの、と考えていただければよろしいかと思いますぞ」

CSお嬢様「つまり私にとってのじいや、ってことですわね！」

じいや「まあそれで良いでしょう」

# おわりに
じいや「どうでしたかな」

CSお嬢様「よく分かったわ、ありがとうじいや」

じいや「これからも少しずつセキュリティの知識を身につけて」
じいや「**真のサイバーセキュリティお嬢様**を目指すのですぞ」

CSお嬢様「わたくし頑張りましてよー！」

# 参考文献
イラスト図解式　この一冊で全部わかるセキュリティの基本
情報処理教科書　情報処理安全確保支援士 2022年版

### 前回までのあらすじ

[サイバーセキュリティお嬢様「CIAってなんですの？」](https://qiita.com/choco_py3/items/51c04bdc8bfe25fe84f3)
[サイバーセキュリティお嬢様「しんせいせい...ってなんですの？」](https://qiita.com/choco_py3/items/0d05409534f267e40001)
[サイバーセキュリティお嬢様「き...脆弱性ってなんですの？」](https://qiita.com/choco_py3/items/15479e37b011c34abf36)
[サイバーセキュリティお嬢様「マルウェア...？スキーウェアのお仲間ですの？」](https://qiita.com/choco_py3/items/00af04f6906de4135b48)
[サイバーセキュリティお嬢様「クラッカー？何それ食べられますの？」](https://qiita.com/choco_py3/items/40fe5a27af3722daa654)
[サイバーセキュリティお嬢様「ハクティビストってなんですの？」](https://qiita.com/choco_py3/items/262df8fc893cf7fd303f)
[サイバーセキュリティお嬢様「F5攻撃（アタック）ってなんですの？」](https://qiita.com/choco_py3/items/f0164dedc7e4b761b25d)

### 次回のお話
[サイバーセキュリティお嬢様「クロスサイトスクリプティング？...美味しそうですわぁ！」](https://qiita.com/choco_py3/items/f3bb70ecf819bb55ad80)

# 宣伝
[技術書典13](https://techbookfest.org/event/tbf13)にサークル参加予定です。
良かったら[Twitter](https://twitter.com/choco_py3)フォローしてください！