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開発に携わるすべてのエンジニアにとって、プレースホルダを利用した安全なデータベース操作の実装は「最低限の義務」と言えます。
関連する用語 (security)
DDoS攻撃とは?DoS攻撃との違いからWebサーバーを標的にした仕組みを解説
サイバー攻撃の代表格「DDoS攻撃」について、大量のアクセスでサーバーをダウンさせる仕組みと、AWS・CloudflareなどのCDNを用いた防御策を解説。
XSS(クロスサイトスクリプティング)とは?仕組みとフロントエンドの対策
Webの代表的な脆弱性「XSS(クロスサイトスクリプティング)」について、悪意あるJavaScriptが実行される仕組みとReact等のFWによる対策を解説。
ゼロデイ攻撃とは?防ぐのが最も難しいサイバー攻撃の仕組みと対策
未知の脆弱性を突く「ゼロデイ攻撃」について、なぜ発見と防御が困難なのか、そして被害を最小限に抑えるための多層防御の考え方を解説します。