※本記事にはアフィリエイトリンクが含まれます。詳しくはプライバシーポリシー・広告掲載についてをご覧ください。
「うちのサイトは大丈夫」と思っていませんか?SQLインジェクションはIPAの情報セキュリティ10大脅威に毎年ランクインする、依然として最も危険なWebアプリケーション攻撃の一つです。本記事では、SQLインジェクションの仕組みを具体的なコード例とともに解説し、今すぐ実施できる防御策を紹介します。
SQLインジェクションとは何か
SQLインジェクション(SQL Injection)とは、WebアプリケーションがユーザーからのデータをSQLクエリに組み込む際、悪意ある文字列を注入することでデータベースを不正操作する攻撃手法です。
攻撃に成功すると、攻撃者は以下のような被害を引き起こせます:
- 顧客の個人情報・パスワードの窃取
- データベース内の全データ削除
- 管理者権限の不正取得
- サーバーへの任意コマンド実行(環境によっては)
攻撃の具体例:ログイン画面への悪用
典型的な攻撃例を見てみましょう。以下のような脆弱なログイン処理があるとします。
// 脆弱なコード例(PHP)
$sql = "SELECT * FROM users WHERE username='" . $_POST['username'] . "' AND password='" . $_POST['password'] . "'";
攻撃者がユーザー名に ' OR '1'='1' -- と入力すると、SQLは以下のように変化します:
SELECT * FROM users WHERE username='' OR '1'='1' --' AND password='...'
'1'='1' は常に真、-- 以降はコメントアウトされるため、パスワードなしで全ユーザーのログインが可能になります。
SQLインジェクションの主な種類
1. クラシック(エラーベース)SQLインジェクション
エラーメッセージをそのまま表示するサイトに対して有効。攻撃者はエラー内容からDBの構造・バージョンを把握し、攻撃を洗練させます。
2. ブラインドSQLインジェクション
エラーが表示されない場合でも、真/偽の応答の違いを使ってデータを少しずつ抽出する手法。時間のかかる手口ですが、Burp SuiteなどのツールでAが自動化されています。
3. UNION型SQLインジェクション
UNION句を使って別テーブルの情報を取得。例えば UNION SELECT username, password FROM admin_users -- のような形で管理者テーブルを抽出します。
4. タイムベースSQLインジェクション
DBの応答時間を制御(例: SLEEP(5))することで情報を推測する。応答時間の差異をもとにデータを1ビットずつ推測します。
SQLインジェクションの被害事例
国内外で深刻な被害が相次いでいます:
- 国内ECサイト: SQLインジェクションによりクレジットカード情報数万件が漏洩するケースが継続発生
- 地方自治体Webサイト: 住民情報DBへの不正アクセス(IPA報告事例)
- 海外事例(2023-2024年): MOVEit Transferの脆弱性悪用(SQLi起因)で2,000以上の組織が被害
IPAの脆弱性対策情報でも、SQLインジェクションは毎年多数の届出が寄せられる最重要脆弱性カテゴリに分類されています。
SQLインジェクション対策:今すぐできる5つの防御策
対策1:プリペアドステートメント(最重要)
最も確実な対策はプリペアドステートメント(prepared statement)の使用です。ユーザー入力をSQLの「データ」として扱い、コードとして解釈させません。
// 安全なコード例(PHP + PDO)
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->execute([$username, $password]);
この方法では、たとえ ' OR '1'='1 が入力されても、文字列リテラルとして安全に処理されます。
対策2:ORMの活用
Laravel(Eloquent)・Django ORM・Ruby on Rails(ActiveRecord)などのORMを使うと、SQLの直接記述を避けられます。ただしRaw SQLを使う箇所は個別に対策が必要です。
対策3:入力バリデーション・エスケープ処理
プリペアドステートメントと組み合わせて、入力値の型・長さ・形式を厳密に検証します。特殊文字(' " ; --)のエスケープ処理も有効ですが、これだけに頼るのは危険です。
対策4:WAF(Webアプリケーションファイアウォール)の導入
WAFはSQLインジェクション攻撃パターンを自動検知・ブロックします。クラウドWAF(AWS WAF、Cloudflare WAFなど)を使えば、既存アプリへの変更なしに防御層を追加できます。
対策5:最小権限の原則
WebアプリがDBに接続するアカウントには、業務に必要な最小限の権限のみ付与します。SELECT専用のアカウントではDELETE・DROPが実行できず、万一SQLiが成功しても被害を限定できます。
診断・脆弱性チェック方法
自社サイトの安全性を確認するには以下の方法があります:
- IPAの「iLogScanner」: アクセスログからSQLi試行を検出する無料ツール
- ペネトレーションテスト: 専門業者による疑似攻撃でリスクを事前評価
- 静的解析ツール: SonarQube等でコードレベルのSQLi脆弱性を検出
NISTのサイバーセキュリティフレームワークでも、定期的な脆弱性評価をセキュリティ基盤として推奨しています。
おすすめセキュリティ対策ツール
本記事で紹介した対策を実施するうえで役立つ製品をご紹介します。
🛡️ まず今日から始めるなら:エンドポイント保護ソフトの導入
SQLインジェクション対策と合わせて、マルウェア感染・不正アクセスを防ぐエンドポイント保護の導入を強くお勧めします。
- ESET(イーセット) — 誤検知が少なく軽量。中小企業に人気のコスパ重視セキュリティソフト
- ウイルスバスター — 日本語サポートが充実。国産ソフトで中小企業導入実績多数
- Norton(ノートン) — 世界最大手のセキュリティベンダー。VPN機能も含む総合対策
※ 上記はアフィリエイトリンクです。料金・機能は各公式サイトで必ずご確認ください。
✅ おすすめのセキュリティソフト
※ アフィリエイトリンクを含みます。料金・詳細は各公式サイトでご確認ください。
まとめ:SQLインジェクションから組織を守るポイント
- SQLインジェクションはIPAが毎年警告する最重要Web攻撃。被害は個人情報漏洩から全データ消去まで深刻
- 最重要対策はプリペアドステートメント。SQL文とデータを分離することで根本的に防御できる
- ORM・入力バリデーション・WAFを組み合わせた多層防御が基本
- DBアカウントには最小権限を付与し、万一の被害を限定する
- 定期的なペネトレーションテストと脆弱性診断で継続的に安全性を確認する
SQLインジェクションは古くから知られた攻撃ですが、2026年現在も対策が不十分なサイトへの攻撃は続いています。今日紹介した対策を一つずつ実施して、自社サービスの安全性を高めてください。
参考資料: 脆弱性対策情報(IPA) / 情報セキュリティ10大脅威 2026(IPA)


コメント