SQLインジェクション
定義
MITRE の CWE(ソフトウェアの弱点の分類)は、SQL インジェクションを CWE-89 として、「外部から影響を受ける入力を使って SQL の命令の全部または一部を組み立てるが、意図した命令を変えうる特別な要素を、無害化しない、または誤って無害化する」弱点と定義しています。MITRE の CWE Top 25(最も危険なソフトウェアの弱点の一覧、2025年版)では2位です。
何が起きうるか
命令の意味が書き換えられると、データベースの中身を読まれる、書き換えられる、消されるなどにつながりえます。CWE-89 の説明のとおり、原因は「値」と「命令」の区別が付かなくなることです。
違い・誤解しやすい点
- 「入力の記号をエスケープすれば十分」:OWASP の手引きは、入力をすべてエスケープする方法を「強く非推奨」としています。データベースごとの実装に強く依存し、ほかの防御に比べて壊れやすく、すべての場合に防げるとは言えないためです
- 「古い脆弱性なので、もう無い」:米国の CISA(サイバーセキュリティ・インフラストラクチャセキュリティ庁)と FBI(連邦捜査局)は、SQL インジェクションは過去20年にわたって広く知られ、有効な対策もあるのに、製品に作り込まれ続けているとし、SQL インジェクションは遅くとも2007年から、他者から「許されない」脆弱性とされてきたと書いています。そのうえで、作り手にこの種類の欠陥を丸ごと無くすよう求めています(Secure by Design Alert、2024年3月)。この警告は、ファイル転送の製品の SQL インジェクションの悪用で、数千の組織が影響を受けた事案を受けたものです
- [[クロスサイトスクリプティング]]との違い:どちらも無害化の不足ですが、SQL インジェクションはデータベースへの命令が書き換えられる弱点、XSS はほかの利用者のブラウザでスクリプトが動く弱点です
守る手段
IPA は、脆弱性ごとの対策を「根本的解決」と「保険的対策」に分けています。下の並べ方は、IPA と OWASP(Web アプリケーションのセキュリティの団体)に沿った筆者の整理です。
| 区分 |
手段 |
内容 |
| 根本的解決 |
SQL 文をパラメータに入れない |
IPA は、Web アプリケーションに渡すパラメータ(hidden の値など)に SQL 文をそのまま指定しないことを、根本的解決の一つとして挙げている |
| 根本的解決 |
プレースホルダで SQL 文を組み立てる |
IPA は根本的解決として、SQL 文の組み立てを全てプレースホルダで実装することを挙げている。SQL 文の雛形の中に値の場所を示す記号を置き、後から値を機械的に割り当てる。OWASP も、第一の防御としてパラメータ化したクエリ(プリペアドステートメント)を挙げている |
| 根本的解決に準じる(筆者の整理。OWASP の主要な防御) |
ストアドプロシージャを安全に使う |
OWASP は、安全に作られたストアドプロシージャは、パラメータ化したクエリと同等に効果があるとしている。中で SQL 文を文字列の連結で組み立てると、同じ弱点が残る |
| 根本的解決 |
文字列の連結で組み立てるなら、データベースの API でエスケープする |
IPA は、文字列の連結で SQL 文を組み立てる場合は、データベースのエンジンの API を使って、値を SQL 文のリテラルとして正しく組み立てることも、根本的解決として挙げている。一方、OWASP は、同じ系統の方法(入力をすべてエスケープする)を、データベースごとの実装に依存し壊れやすいとして強く非推奨とし、新しく作るならパラメータ化したクエリなどで作るよう求めている。プレースホルダを使えない場合に限る手段と考える(筆者の整理) |
| 根本的解決に準じる(筆者の整理。OWASP の主要な防御) |
許可リストで入力を確かめる |
並べ替えの列名のように、プレースホルダにできない部分は、決めた値の一覧に照らして確かめる(OWASP) |
| 保険的対策 |
権限を絞る、エラーを見せない |
データベースのアカウントに必要な権限だけを与える(IPA、OWASP。最小権限の原則)。データベースのエラーメッセージをそのままブラウザに表示しない(IPA) |
IPA は、プレースホルダには、データベースの側で値を割り当てる静的プレースホルダ(規格では「準備された文」と呼ぶ)と、接続のライブラリの中でエスケープして当てはめる動的プレースホルダがあり、どちらでも脆弱性を解消できるとしています。そのうえで、原理的に SQL インジェクションの脆弱性の可能性がなくなるという点で、静的プレースホルダの方が優るとしています。
関連するページ
出典
確認日:2026年10月18日
最終更新:2026年10月18日 18:19