# 【実例・対策あり】SQLインジェクションとは？

> SQLインジェクションについて具体的な攻撃例、被害事例、および効果的な対策方法について詳しく解説しました。SQLインジェクションによるリスクを理解し、防止策を知っておきましょう。

- 公開日: 2025-01-15
- 著者: Matsu
- タグ: エンジニア概念マップ
- URL: https://tech.anycloud.co.jp/articles/sql-injection

---

## SQLインジェクションとは？

SQLインジェクションは、ウェブアプリケーションのセキュリティ上の脆弱性を悪用する攻撃手法の1つです。

攻撃者がアプリケーションに入力するデータを利用して、意図しないSQLクエリを実行させることで、データベースに不正なアクセスや操作を行います。

この攻撃により、以下のような被害が発生する可能性があります。

-   データベース内の機密情報（ユーザー名、パスワード、個人情報など）の漏洩
-   データの改ざんや削除
-   アプリケーションの動作不全

### SQLインジェクションの例

次のようなコードがあるとします。

```sql
SELECT * FROM users WHERE username = '" + userInput + "';
```

ここで、`userInput`に攻撃者が次のような文字列を入力した場合：

```sql
' OR '1'='1
```

実行されるSQLクエリは以下のようになります：

```sql
SELECT * FROM users WHERE username = '' OR '1'='1';
```

このクエリは、条件`'1'='1'`が常に真であるため、すべてのユーザー情報が返されてしまいます。

## 実際のSQLインジェクションによる攻撃ケース

SQLインジェクションは、特定の状況下で実行されることがあります。

以下にその一例を紹介します。

### ユーザー認証システムでの悪用

攻撃者がログインフォームに次のような入力を行った場合：

-   ユーザー名: `admin' --`
-   パスワード: （空白）

この入力により、次のようなSQLクエリが生成される可能性があります：

```sql
SELECT * FROM users WHERE username = 'admin' -- ' AND password = '';
```

`--`はSQLでコメントアウトを意味するため、`AND password = ''`の部分が無効化され、攻撃者はパスワードなしで「admin」アカウントとしてログインできます。

### 検索機能の悪用

検索フォームに次のような入力を行った場合：

```sql
' UNION SELECT credit_card_number, NULL, NULL FROM credit_cards --
```

この入力が直接SQLクエリに組み込まれると、攻撃者は別のテーブル（ここでは`credit_cards`）からデータを取得することができます：

```sql
SELECT * FROM products WHERE name = '' UNION SELECT credit_card_number, NULL, NULL FROM credit_cards --';
```

これにより、攻撃者はクレジットカード情報を盗むことができます。

## **SQLインジェクションによる被害事例**

SQLインジェクションは、企業の大小問わずに起こり得ます。

実際に、[SQLインジェクションによる被害事例](https://www.kagoya.jp/howto/it-glossary/security/sql-injection/#:~:text=%E3%82%82%E5%A4%9A%E3%81%84%E3%81%A7%E3%81%99%E3%80%82-,SQL%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AB%E3%82%88%E3%82%8B%E8%A2%AB%E5%AE%B3%E4%BA%8B%E4%BE%8B,-SQL%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6)の記事にて、多くの事例が紹介されているのでこちらも参考にしてみてください。

## **SQLインジェクションの対策方法6つ**

SQLインジェクションの被害を受けないようにするためには、どのような対策をとればよいのかを紹介します。

1.  エスケープ処理
2.  プレースホルダを利用
3.  入力値を制限
4.  WAFの導入
5.  定期的な脆弱性診断

それぞれについて、詳しくみていきましょう。

### **1\. エスケープ処理**

エスケープ処理は、SQLインジェクション向けの対策として最も基本的かつ効果的な方法となります。

不正なSQL文に悪用される特殊な文字を無害な文字へ書き換えることができます。

これにより、SQL文を実行しようとしても無効化できます。

### **2\. プレースホルダを利用**

プレースホルダを使うと、攻撃者がWebサイトへ実行した不正なSQL文が単なる値として判断され、SQL文として実行されてしまうのを防ぐことができます。

### **3\. 入力値を制限**

入力可能な文字列を英数字のみに制限するなどの対策です。

### **4\. WAFの導入**

WAF（Web Application Firewall）は、Webアプリケーションを保護するファイアウォールのことです。

WAFを導入することでSQLインジェクションだけではなく、XSSやCSRFなど幅広いサイバー攻撃に対する無力化が可能になります。

### **6.** 定期的な脆弱性診断

定期的に脆弱性診断をすることで、攻撃者の視点でシステムやネットワークの脆弱性を洗い出してくれます。

SQLインジェクション以外の様々なサイバー攻撃により脆弱性の有無を調べられます。

## まとめ

今回は、SQLインジェクションを紹介しましたが、SQLインジェクションだけでなく、流行りのサイバー攻撃の情報を定期的に確認して、対応していくことが重要ですね。

対策を取らずに放置してしまうと、情報の漏えいや改ざんなどの被害を受けてしまうので、しっかりと対策しておきましょう。
