SQLインジェクションとは?仕組み・被害事例・対策をわかりやすく解説

SQLインジェクションとは?仕組み・被害事例・対策をわかりやすく解説

SQLインジェクションは、Webアプリケーションの脆弱性を突く代表的なサイバー攻撃の一つです。

SQLインジェクションによってデータベースに保存された個人情報や機密情報が不正に取得されると、情報漏えいによる法的責任や事業リスクが発生する可能性があります。実際に当社が2025年7月~9月に実施した調査では、SQLインジェクションを含む従来型のWebアプリケーション攻撃が過去最高水準で観測されており、自動化された無差別スキャンによる攻撃が継続的に行われている状況が確認されています。

この記事では、SQLインジェクションの基礎知識やその仕組みについてわかりやすく解説します。対策方法も紹介するので、最後までご覧ください。

SQLインジェクションとは?

SQLインジェクションとは、Webアプリケーションの入力処理の不備を突き、不正なSQL文を実行させてデータベース内の情報を取得・改ざん・削除するサイバー攻撃手法です。SQLインジェクションが成立するかどうかは、SQL文の組み立て方や入力値の扱い方によって左右されます。

SQLはデータベースを操作するための命令言語であり、多くのWebアプリケーションでは、ユーザが入力した内容をもとにSQL文を生成し、データベースへの問い合わせや更新処理を行っています。

入力された内容が適切に制御されていない場合、攻撃者が細工した文字列を入力することで、本来想定していないSQL文が生成されます。その結果、攻撃者がデータベースを不正に操作でき、個人情報や機密情報の漏えい、Webサイトの改ざん、データ消去につながる可能性があります。

SQLインジェクションの手口

【マンガで解説】SQLインジェクションの基本

専門ツールなしでは、完全な対策が難しいSQLインジェクション。

SQLインジェクションは、一度被害にあうと大規模なデータ流出にもつながる大きなリスクがあり、対策には正確な理解が不可欠です。

そこで、SQLインジェクションについてわかりやすく解説した資料をご用意しました。

・SQLインジェクションとはなにか
・どんなリスクが潜んでいるのか
・どのように対策をすればいいか

などを解説しています。ぜひご活用ください!

【無料】おしえて!WAFくん WAFで防げる攻撃 SQLインジェクション編 をダウンロードする

SQLインジェクションの仕組み

SQLインジェクションの挙動を理解するためには、まずWebアプリケーションが通常どのようにSQL文を生成し、データベースを操作しているかを把握する必要があります。
ここでは、SQL文の基本的な動きと、SQLインジェクションを受けた場合にどのような変化が起こるのかを順に解説します。

SQL文の基本の動き

まずは、SQL文の基本の動きについて解説します。

(例)ユーザ情報が格納されているデータベースのテーブルから、入力されたIDに合致するデータを抽出する。

この場合、アプリケーションが持っているSQL文の形は下記となります。

SELECT * FROM user WHERE id = ‘$ID’

それぞれの語句の意味は下記の通りです。

SELECT データを抽出する
テーブルに含まれる項目全て
FROM user userという名前のテーブルからデータを選択する
WHERE <条件> 抽出条件を指定

‘$ID’の部分は「データを抽出する条件」となります。ユーザーがWebサイトのID欄に入力した内容がこの箇所に反映されるので、変動箇所とも呼ばれます。「taro」がID欄に入力された場合、下記のSQL文が生成されます。

SELECT * FROM user WHERE id = ‘taro’

このSQL文によってIDが「taro」と合致した関連情報がデータベースから出力されます。

SQLとWebアプリケーションの基本処理

SQLインジェクションを受けた場合の動き

では、SQLインジェクションが成立した場合はどうなるのでしょうか。ここでは一例を示します。

仮に‘$ID’の部分に「taro」に続いて「’ or ‘1’=’1」が注入(インジェクション)されたとします。この場合、生成されるSQL文は以下のとおりです。

SELECT * FROM user WHERE id = ‘taro’ or ‘1’=’1′

上記のSQL文にはデータを抽出する条件が2つあります。

1つ目はIDが「taro」と合致した場合です。この場合は「taro」の情報が出力されます。ここまでは前述した基本の動きと同じです。

2つ目は‘1’=‘1’が成立した場合です。ただし、‘1’=‘1’は常に真となる条件であるため、この条件が加わることで、データベースに格納されているすべてのデータが出力されます。その結果、本来は閲覧できない情報まで取得されてしまい、情報漏えいにつながります。

SQLインジェクションを受けた場合の処理

SQLインジェクションによる被害

SQLインジェクションが成立すると、Webアプリケーションを経由してデータベースが不正に操作され、Webサイトの改ざんや業務停止など、事業継続に影響するケースも少なくありません。

ここでは、SQLインジェクションによって発生しやすい代表的な被害について解説します。

情報漏えい

SQLインジェクションの被害として代表的なものが、情報漏えいです。

データベースには、会員情報や顧客情報、メールアドレス、パスワードなどの重要なデータが格納されています。サイトやシステムの構成によっては、決済に関連する情報がデータベースに保存されているケースもあります。SQLインジェクションによって不正なSQL文が実行されると、攻撃者はデータベース内の情報を一括で取得できる可能性があります。

個人情報や機密情報が漏えいした場合、利用者への影響だけでなく、企業側も法的責任や信用低下といった大きなリスクを負うことになります。また、漏えいした情報が第三者によって悪用され、二次被害につながるケースもあります。

Webサイトの改ざん

SQLインジェクション攻撃の被害として、Webサイトの改ざんも挙げられます。

SQLインジェクションによってデータベースを不正に操作されると、Webサイト上に表示される情報が書き換えられたり、既存のコンテンツが削除されたりする可能性があります。企業や団体のWebサイトが改ざんされた場合、誤った情報の掲載や意図しないコンテンツの表示によって、利用者に混乱を与えるだけでなく、企業の信用低下にもつながります。

また、ユーザー情報を管理するデータベースが操作された場合、利用者のログインパスワードなどアカウント情報が更新されるおそれもあります。パスワードが改ざんされると、正規の利用者がアカウントにログインできなくなるだけでなく、攻撃者によるなりすましや不正操作につながる可能性があります。

さらに、改ざんされたWebサイトに不正なスクリプトやマルウェアが埋め込まれ、閲覧者が意図せずウイルスに感染する被害が発生するケースもあります。このような二次被害が発生した場合、被害範囲がWebサイトの利用者全体に広がるおそれがあります。

SQLインジェクションの被害事例

SQLインジェクションは理論上の脅威にとどまらず、実際に多くの企業やWebサービスで被害が発生しています。ここでは、過去に公表された事例をもとに、SQLインジェクションによってどのような被害が発生したのかを具体的に紹介します。

リサーチ会社から約10万件の情報流出

2022年6月、国内のリサーチ・調査会社がSQLインジェクションによる不正アクセスを受け、約10万件の情報が流出した可能性があると公表しました。

当該Webサービスでは、外部からの入力を処理するWebアプリケーションにSQLインジェクションの脆弱性が存在しており、データベースに保存されていた顧客情報が不正に取得されたと報告されています。

被害確認後、企業はWebサイトを一時的に閉鎖し、関連するサービスの提供も停止する対応を取りました。業務継続への影響だけでなく、利用者への説明対応や再発防止策の実施など、大きな負担が発生しています。

家具販売ECサイトから個人情報約2万件流出

2022年2月、国内の家具販売会社が運営するECサイトに対してSQLインジェクション攻撃が行われ、顧客および取引先のメールアドレス情報が流出した事例が公表されています。

公表によると、Webアプリケーションの脆弱性を突いた不正アクセスにより、顧客のメールアドレス約1万件、取引先関係者のメールアドレスを含む情報が合計2万件超取得された可能性があるとされています。調査の結果、SQLインジェクションによってデータベースが不正に操作されたことが原因と報告されています。

本事例では、ECサイトを通じて取得・管理していた情報がまとめて参照可能な状態となっており、攻撃者がデータベース内の情報を一括で取得できるリスクが顕在化しました。ECサイトのように多くの個人情報を扱うWebサービスでは、SQLインジェクション対策が不十分な場合、被害が短期間で大規模化するおそれがあることを示す事例といえます。

住宅メーカーの会員制サイトから46万人超に影響が及んだ事例

2024年5月、国内の大手住宅メーカーが運営する住宅オーナー向け会員制Webサイトにおいて、不正アクセスが確認されました。調査の結果、Webアプリケーションに残存していた脆弱性を突いたSQLインジェクションを含む攻撃が行われた可能性があると公表されています。

本事例では、顧客情報約10万人分に加え、従業員や協力会社関係者のメールアドレスやパスワード情報など、漏えいした可能性がある範囲は合計で46万人以上に及びました。

攻撃を受けた会員制サイトは当時利用されておらず、長期間にわたって保守や更新が行われていなかったことが確認されています。その結果、Webアプリケーションに存在していた脆弱性が放置され、SQLインジェクションによってデータベースへ不正にアクセス可能な状態となっていました。

本事例は、現在利用されていないWebサイトや会員制システムであっても、インターネット上に公開されている限り攻撃対象となることを示しています。また、ひとたび被害が発生すると、影響範囲は顧客にとどまらず、従業員や関係会社を含む広範囲に及び、事後対応や復旧、説明対応などに多大なコストが発生する点も見逃せません。

このような被害を踏まえ、「どの程度の対策が必要なのか」「セキュリティ対策にどれくらいの費用をかけるべきか」を経営視点で整理することが重要になります。
セキュリティ対策費用の考え方や、経営層を納得させるための整理方法については、以下の資料で詳しく解説しています。

【無料】「経営者を納得させるためのセキュリティ対策費用算出の考え方」 をダウンロードする >

5つのSQLインジェクションの対策方法

SQLインジェクションは、単一の防御策に依存するのではなく、アプリケーション実装、設定、運用の各段階で多層的に対処することが重要になります。ここでは、SQLインジェクション対策として特に重要な5つの方法を解説します。

1.プレースホルダの利用

プレースホルダとは、SQL文の中でユーザー入力が入る変動部分をあらかじめ記号として定義し、SQL文の構造と入力値を分離する仕組みです。例えば下記の例だと、疑問符(?)がプレースホルダに該当します。

SELECT * FROM user WHERE id = ?

このようにプレースホルダを使用すると、ユーザーが入力した値はSQL文の一部として解釈されず、単なる値としてデータベースに渡されます。その結果、SQL文の構造自体を書き換えることができなくなり、不正なSQL文の実行を防ぐことが可能になります。

プレースホルダの組み立て方については、IPAが作成した「安全なSQLの呼び出し方」の第3章をご参照ください。

2.エスケープ処理

エスケープ処理とは、ユーザーから入力された特定の文字や記号を無効化し、SQL文として解釈されないように変換する処理です。SQLでは、シングルクォート(’)やダブルクォート(”)、セミコロン(;)などの文字が特別な意味を持つため、これらを適切にエスケープすることで、SQL文の構造が意図せず変更されることを防げます。

ただし、エスケープ処理は実装方法や文字コードの違いによって回避されるケースもあるため、単独での対策としては不十分になる可能性があり、プレースホルダの利用など他の対策と組み合わせて実装することが重要です。

エスケープ処理はSQLインジェクション対策だけでなく、クロスサイトスクリプティングなど他の入力値を悪用する攻撃への対策としても有効なため、入力値の安全性を高める基本的な処理として適切に実装する必要があります。

エスケープ処理の手順については、IPAが作成した「安全なSQLの呼び出し方」の第4章をご参照ください。

3.エラーメッセージをそのままブラウザに表示しない

Webアプリケーションでエラーが発生した際に、詳細なエラーメッセージをそのままブラウザに表示してしまうと、攻撃者はエラーメッセージを手がかりに、使用しているデータベースの種類やSQL文の構造、入力値の扱い方を特定しようとします。エラー内容が詳細であるほど、攻撃者は効率的に攻撃手法を調整できるようになります。

そのため、Webアプリケーションでは、利用者向けの画面には抽象化したエラーメッセージのみを表示し、詳細なエラー情報はログとしてサーバ側に記録する運用が重要です。エラー発生時に内部情報が外部へ露出しないよう制御することで、SQLインジェクションを含む攻撃の成功率を下げることができます。

4.データベースアカウントに適切な権限を与える

Webアプリケーションが使用するデータベースアカウントに過剰な権限を付与している場合、SQLインジェクションが成功した際に、情報の参照だけでなく、データの改ざんや削除、設定変更といった操作まで実行されるおそれがあります。そのため、データベースアカウントには、業務上必要な最小限の権限のみを付与することが重要です。

権限を適切に制御することで、不正なSQL文が実行された場合でも被害範囲を限定できます。アプリケーションの機能ごとにデータベースアカウントを分離する運用も、被害拡大を防ぐ有効な対策です。

5.多層防御としてのWAF活用

WAF(Web Application Firewall)は、Webアプリケーションへの通信内容を監視し、SQLインジェクションを含む不正なリクエストを検知・遮断するセキュリティ対策です。WAFはWebアプリケーションとインターネットの間に配置され、HTTPリクエストやパラメータを解析することで、攻撃パターンを含む通信をブロックします。

SQLインジェクションは、不正なSQL文や攻撃特有の文字列が入力フォームやURLパラメータに含まれるため、WAFによってこうした不正な通信を検知・遮断できます。アプリケーション側でプレースホルダや入力制御を実装していても、設定ミスや未対応箇所が存在する場合があり、WAFはそれらを補完する防御手段として機能します。

また、WAFはアプリケーションの修正を伴わずに導入できる点も特徴です。既存のWebサービスを停止することなく、SQLインジェクション対策を強化できるため、運用負荷を抑えながら防御レベルを高めることが可能です。SQLインジェクションだけでなく、クロスサイトスクリプティングなど他のWebアプリケーション攻撃への対策としても有効です。

WAFの仕組みや導入メリットについては、以下の資料で詳しく図解しています。
【無料】3分でわかるWAF をダウンロードする >

まとめ

SQLインジェクション対策では、アプリケーションの実装改善に加えて、運用面からの防御を組み合わせることが重要です。

WAFを導入することで、アプリケーションの修正が追いつかない箇所や、想定外の攻撃パターンに対しても防御を補完できます。特に、ECサイトや会員制サイト、顧客管理システムなど、24時間稼働しており停止が難しいWebサービスでは、継続的な監視や迅速な遮断が求められるため、WAFによる対策が有効です。

クラウド型WAFの選択肢の一つとして、国内シェアNo.1※の「攻撃遮断くん」があります。「攻撃遮断くん」は月額10,000円〜導入可能で、システム変更が不要なため最短1日で導入できる日本国内で開発・運用されているWAFです。ユーザ側での運用は一切必要ないため、低価格かつ簡単にSQLインジェクションをはじめとするWebアプリケーション攻撃への対策を強化できる点が特徴です。

【月額1万円~】SQLインジェクション対策なら、攻撃遮断くん

SQLインジェクション対策として、WAFの導入を検討している方に向けて、「攻撃遮断くん」のサービス資料をご用意しています。
「攻撃遮断くん」は、SQLインジェクションをはじめとしたWebアプリケーション攻撃を対象に、通信の監視・遮断を行うクラウド型WAFです。

月額1万円から利用でき、システム修正やアプリケーション改修は不要です。
既存の対策を補完しながら、運用負荷を抑えて防御を強化したい場合の選択肢としてご活用ください。

【無料】「攻撃遮断くん」のサービス資料をダウンロードする

デロイト トーマツ ミック経済研究所「外部脅威対策ソリューション市場の現状と将来展望 2024年度」

Webサイトをサイバー攻撃から
守るなら
攻撃遮断くん 攻撃遮断くん

ご利用お申し込み、お見積り依頼、
Webセキュリティに関する相談はこちらから!