security 2026-03-05

SQLインジェクションとは?攻撃の仕組みとWeb開発での対策方法

Webアプリケーションの致命的な脆弱性「SQLインジェクション」について、攻撃の具体的な仕組み(データベースの不正操作)と防止策を解説します。

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

SQLインジェクション(SQL Injection / SQLi)は、Webアプリケーションの入力フォームなどを通じて悪意のあるSQLコマンド(データベースを操作する言語)を「注入(インジェクション)」し、データベースを不正に操作するサイバー攻撃の一種です。

IPA(情報処理推進機構)が発表する「安全なウェブサイトの作り方」でも、最も危険度が高い脆弱性の1つとして長年警告され続けています。

攻撃による主な被害

この脆弱性を突かれると、以下のような致命的な被害が発生します。

  • 機密情報の漏洩: 全ユーザーのID・パスワード、クレジットカード情報などが盗み出される。
  • データの改ざん・削除: データベース内の情報が書き換えられたり、すべて消去(DROP TABLEなど)されたりする。
  • 不正ログイン: 管理者パスワードを知らなくても、管理者としてログインできてしまう。

どのような場面で(どうやって)発生するか

開発者が、ユーザーの入力値を「そのまま」SQL文の文字列として結合(組み立て)してしまっている箇所で発生します。

攻撃の具体例(認証回避)

例えば、ログイン機能で以下のようなSQL文を作っていたとします。(パスワードチェックは省略)

SELECT * FROM users WHERE username = '$ユーザー入力値'

ここで、攻撃者が入力フォーム(ユーザー名)に admin' OR '1' = '1 と入力したとします。すると完成するSQLは以下のようになります。

SELECT * FROM users WHERE username = 'admin' OR '1' = '1'

'1' = '1' は常に「真(True)」となるため、パスワードがわからなくてもWHERE句の条件を強引に突破し、adminとしてログインできてしまいます。

実務上の注意点(対策・防御方法)

SQLインジェクションは、正しいコーディングを行うことで100%防ぐことができる脆弱性です。

プレースホルダ(バインド機構)の利用

現代のWeb開発において、SQLを文字列結合で作成するのはご法度です。 必ず「プレースホルダ(安全なパラメータ割り当て機構)」を使用してください。PDO(PHP)や各種ORM(Prisma, TypeORMなど)の標準機能を使っていれば、入力値に含まれる危険な文字('; など)は自動的に単なる「文字データ」として無害化(エスケープ処理)され、SQLの命令としては解釈されなくなります。

その他の対策(多層防御)

  • WAFの導入: ALBやCloudFrontにWAF(Web Application Firewall)を導入し、SQLインジェクション特有の文字列(OR 1=1 など)をネットワークの入り口で遮断します。
  • DB権限の最小化: アプリケーションからDBに接続するユーザーには、不要なテーブルへのアクセス権やDROP(削除)権限を与えないようにします。

まとめ

SQLインジェクションは、古典的でありながら一度発生すると企業が倒産するレベルの被害をもたらす恐ろしい脆弱性です。Web開発に携わるすべてのエンジニアにとって、プレースホルダを利用した安全なデータベース操作の実装は「最低限の義務」と言えます。

おすすめの高速レンタルサーバー PR
🛡️

世界最高水準・高速VPN接続

\ 30日間全額返金保証 /

公衆Wi-Fiやスタバでのノマドワークの必須アプリ。通信を強力に暗号化し情報漏洩を防ぎます。

VPNの詳細はこちら

PR: スポンサーリンク

法人・個人向けサポート 受付中

インフラ構築やトラブル対応で お困りではありませんか?

AWSの構築、社内ネットワーク(VPN/NW)の改善、その他原因不明のITトラブルまで、現役インフラエンジニアが直接サポートします。単発でのご相談や、毎月のスポット顧問契約も可能です。

Sponsored Link

実務で即戦力!ITサポート業務委託契約書テンプレート📝 フリーランスエンジニアや副業のシステム保守案件で、トラブルを劇的に防ぐプロ仕様の雛形。
バグ・要望を報告する