SQLインジェクションは、Webアプリケーションの脆弱性を悪用し、
データベースへ不正な命令(SQL)を送り込む攻撃手法です。
顧客情報の流出や、データの改ざん・削除といった被害につながるため、
企業にとって最優先で対応すべきセキュリティリスクのひとつです。
この記事では、専門用語に慣れていない人でも理解できるように、
「仕組み → 何が危険か → どう防ぐか」 を簡潔にまとめて解説します。
目次
SQLインジェクションとは?
SQLインジェクションとは、Webアプリケーションの入力欄に
不正なSQL文を埋め込むことで、データベースを思い通りに操作する攻撃 のことです。
本来想定していないSQLが実行されてしまうと、
データの抜き取り(情報漏えい)
データの書き換え(改ざん)
データの削除
管理者アカウントの乗っ取り
といった重大な被害につながります。
なぜSQLインジェクションは起こるのか?
原因はシンプルで、
アプリケーションが受け取った入力値を、そのままSQL文に組み込んでしまう
ためです。
たとえば、ログインフォームの入力値を直接SQLに埋め込むような処理は典型例です。
SELECT * FROM users WHERE username = '入力値' AND password = '入力値';
この部分に攻撃者が、
' OR '1'='1
のような文字列を入れると、「常に真になる条件」に書き換えられ、
ログイン認証が突破されてしまう可能性があります。
SQLインジェクションで起こる被害
SQLインジェクションによって想定される主な被害は以下のとおりです。
● 顧客情報の漏えい
氏名・住所・メールアドレス・会員情報など、大量の個人情報が抜き取られます。
● データの改ざん
売上データや在庫データなど、業務に直接関わる情報を書き換えられる可能性があります。
● データの削除
最悪の場合、商品データや注文データなど、事業に直結する情報が消去されます。
● 管理者アカウントの乗っ取り
攻撃者が管理者権限を取得すると、データベース全体が自由に操作されてしまいます。
SQLインジェクションが発生しやすい箇所
以下のような“ユーザー入力がDB処理につながる部分”は特に狙われます。
ログインフォーム
お問い合わせフォーム
検索フォーム
会員更新フォーム
パラメータ付きURL
CMSの投稿画面
「入力された値がそのままSQLになる可能性がある部分」 はすべて危険です。
SQLインジェクションの代表的な攻撃例
● 5-1. OR条件を利用した認証回避
' OR '1'='1
を入れることで「常に真」になる → 認証突破。
● UNIONを使った情報取得
異なるテーブルのデータを強制的に取得させる攻撃。
● エラーメッセージから内部構造を推測
エラー画面をわざと出し、テーブル名やカラム名を探る。
● データの削除
'; DROP TABLE users;
などを埋め込むことでテーブルそのものを削除される危険も。
SQLインジェクションを防ぐ方法(必須対策)
SQLインジェクションは、適切に対策すれば防げる攻撃です。
最低限実施すべき対策は次のとおりです。
● プレースホルダ(バインド変数)の使用 ※最重要
SQLの中に直接入力値を埋め込まず、
「値の部分だけ後から安全に渡す」仕組み を使います。
例(PHP PDO)
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->execute([$username, $password]);
→ どんなに不正な文字列を入れられても、SQLとして実行されません。
● 入力値のバリデーション
- 文字種制限(数字だけ、英字だけ、など)
- 長さ制限
- 利用目的に応じたチェック
不正な文字を受け入れない仕組みを作ります。
● WAF(Web Application Firewall)の導入
WAFは、
不審なリクエストや攻撃パターンを自動でブロックする防御装置 です。
クラウドWAFでも十分高い効果があります。
● DBユーザーの権限を最小限に
アプリケーション用のDBユーザーには SELECT / INSERT / UPDATE のみ など、
最低限の権限に絞ることで、万が一侵入されても被害を抑えられます。
● エラー画面に内部情報を表示しない
テーブル名・SQL構文・ファイルパスなどが漏れると攻撃のヒントになります。
本番環境は常にエラーメッセージ非表示 にしておきましょう。
SQLインジェクション対策のチェックリスト
- 入力値を直接SQLに埋め込んでいないか
- プレースホルダ(バインド変数)を使用しているか
- 不必要な権限を持つDBユーザーがいないか
- エラーメッセージの表示を制御しているか
- WAFを導入しているか
- 不審なクエリを検知するログ監査をしているか
まとめ
SQLインジェクションは古典的な攻撃ですが、
対策不足のサイトは今も大量に狙われ続けています。
ポイントは次の3つです。
- 入力値をそのままSQLに使わない(プレースホルダ必須)
- 不審なリクエストをWAFで遮断する
- DBユーザーの権限を最小限にする
これらを実践するだけで、多くの攻撃を防ぐことができます。