# SQLインジェクション — 入力からDBに不正な命令を送り込む

> レベル: 初級 ／ 対象: 大人
> 出典: Kotowary — https://kotowary.com/learn/units/sql-injection?level=beginner&audience=adult
**SQLインジェクション**は、入力を通じて**DBに不正な命令を送り込む**攻撃です。「データのはずの入力が、命令になってしまう」のが本質です。

## どう起きる？

DBへの命令（SQL）を、**入力をそのまま文字列でつなげて**作ると危険です。

たとえば「名前で検索」のとき、入力欄に普通の名前ではなく**命令の切れ端**を入れられると、それが命令の一部として解釈され、全件を抜き出す・消す・ログインを突破する、といったことが起きます。

::diagram{name="sqli-attack"}

## どう防ぐ？

1. **パラメータ化クエリ（プレースホルダ）** — 命令の骨組みを先に固定し、入力は「値（データ）」として別枠で渡す。これなら入力は命令として動かない
2. **文字列連結でSQLを組み立てない** — これが鉄則
3. **最小権限** — アプリのDBユーザーに、必要以上の権限（削除・全件）を与えない
4. **入力検証** — 補助として、型や形式も確かめる

## ⚠️ 気をつける

- **エスケープ自作に頼る** — 自前の文字置換は抜けやすい。パラメータ化が正解
- **エラーメッセージの露出** — DBのエラーをそのまま返すと、構造のヒントを与えてしまう
- **ORMでも油断しない** — 生SQLを組み立てる箇所は同じリスク
