---
title: "SQLインジェクションとは？SQL文を不正に操作する攻撃を切り分ける【基本情報技術者試験】"
description: "SQLインジェクションを「入力値がSQL文の一部として解釈され、データベース操作を不正に変えられる攻撃」として整理し、XSS・ディレクトリトラバーサル・バッファオーバーフローとの違いをFE科目Aの判断軸で解説します。"
last_modified_at: "2026-08-07"
canonical_url: "https://stemtazoo.github.io/fe/sql-injection/"
section: "fe"
---

## まず結論

**SQLインジェクションは、利用者の入力がSQL文の一部として解釈されることで、データベースへの問い合わせや操作を不正に変えられてしまう攻撃です。**

FE試験では、選択肢に **「SQL」「データベース」「問い合わせ」「入力文字が特別な意味をもつ」** といった手掛かりがあれば、まずSQLインジェクションを疑います。

特に重要なのは、XSSなどの別の攻撃と「どこで入力が解釈されるか」を切り分けることです。

## 直感的な説明

Webアプリケーションでは、利用者が入力した文字列を使ってデータベースを検索することがあります。

たとえば、利用者が入力した名前をそのままSQL文につなげる仕組みを考えます。

```text
SELECT * FROM users WHERE name = '入力された名前';
```

普通の名前が入力されるだけなら問題はありません。

しかし、入力欄にSQLで特別な意味をもつ記号や文字列が入り、それをそのままSQL文に組み込むと、アプリケーションが意図していないSQL文として解釈されることがあります。

つまり、SQLインジェクションは、

> 入力データとして扱うはずの文字が、SQLの命令の一部として扱われてしまう

ことが問題です。

## 定義・仕組み

SQLインジェクションでは、Webアプリケーションなどが利用者の入力をもとにSQL文を組み立てるとき、その入力を安全に扱えていないことが攻撃につながります。

攻撃が成立すると、意図しない検索や更新、削除などのデータベース操作が行われるおそれがあります。

試験では、細かなSQL文を暗記するよりも、次の流れを理解しておくと判断しやすくなります。

1. 利用者が文字列を入力する
2. アプリケーションがその入力を使ってSQL文を組み立てる
3. 入力中の文字がSQLの一部として解釈される
4. 本来とは異なるデータベース操作が実行される

対策では、**利用者の入力をSQL文の構造として解釈させない**ことが重要です。

FE試験では、「入力された文字をSQLで特別な意味をもつ文字として解釈させない」といった説明が、SQLインジェクション対策の手掛かりになります。

実務では、入力値とSQL文を分けて扱うパラメータ化クエリ（プリペアドステートメント）などが代表的な対策です。

このテーマは、基本情報技術者試験のデータベースと情報セキュリティの両方に関係します。公式の出題範囲やシラバスは、[IPA：基本情報技術者試験](https://www.ipa.go.jp/shiken/kubun/fe.html) から確認できます。

## 科目Aでどう出る？

科目Aでは、SQLインジェクションそのものの定義だけでなく、**他の攻撃への対策と混ぜて出される**ことがあります。

まず「何が解釈される場所なのか」を見ます。

| 問題文・選択肢の手掛かり | 疑う攻撃 |
|---|---|
| SQL、データベース、問い合わせ | SQLインジェクション |
| HTML、スクリプト、ブラウザ表示 | XSS |
| `../`、ファイル、ディレクトリ | ディレクトリトラバーサル |
| 入力サイズ、メモリ領域 | バッファオーバーフロー |

SQLインジェクションを見分けるときは、

**「その入力はデータベースへ渡され、SQLとして解釈されるのか？」**

と考えると選択肢を切りやすくなります。

## 科目Bでどう使う？

科目Bの情報セキュリティでは、攻撃名を暗記しているだけでなく、状況に合った対策を選ぶことが重要です。

SQLインジェクションでは、次の順番で考えます。

1. 利用者から入力を受け取っているか
2. その入力を使ってデータベースへ問い合わせているか
3. 入力値がSQL文の構造に影響できる状態になっていないか
4. 入力値とSQL文を分けて扱う対策になっているか

特に、HTML表示を安全にする処理が書かれていても、それだけではSQLインジェクション対策にはなりません。

**「どこで入力が解釈されるか」→「その場所に合った対策か」** の順で確認するのがポイントです。

## よくある誤解・混同

### XSSとの違い

XSSは、主に入力された文字列がHTMLやスクリプトとしてブラウザで解釈されることを悪用する攻撃です。

SQLインジェクションは、入力された文字列がSQLの一部としてデータベース側で解釈されることを悪用します。

- **SQLとして解釈される** → SQLインジェクション
- **HTML・スクリプトとして解釈される** → XSS

と切り分けます。

### ディレクトリトラバーサルとの違い

ディレクトリトラバーサルは、`../` などを利用して、本来アクセスできないファイルやディレクトリへアクセスしようとする攻撃です。

ファイルパスや上位ディレクトリが問題になっているなら、SQLインジェクションではありません。

### バッファオーバーフローとの違い

バッファオーバーフローは、確保されたメモリ領域を超えるデータを書き込むことで、不正な動作を引き起こす攻撃です。

入力文字列の「意味」ではなく、**入力サイズやメモリ領域**が手掛かりになります。

### 「入力チェックをすれば何でも同じ」ではない

試験では、入力に対する対策が複数並ぶことがあります。

重要なのは「入力をチェックしているか」だけではなく、**どの攻撃を防ぐための処理なのか**を見ることです。

- SQLの構造に影響させない
- HTMLとして実行させない
- 不正なファイルパスを受け付けない
- 過大な入力を受け付けない

では、それぞれ守っている対象が違います。

## まとめ（試験直前用）

- **SQLインジェクション**：入力値によってSQL文を不正に操作する攻撃
- **SQL・DB・問い合わせ**が出たらSQLインジェクションを疑う
- **HTML・スクリプト**ならXSS、**`../`・ファイルパス**ならディレクトリトラバーサル
- **入力サイズ・メモリ**ならバッファオーバーフロー
- 判断に迷ったら、**「入力がどこで、何として解釈されるか」**を見る
