アットウィキロゴ

SQLインジェクション


利用者が入力した値などを使ってデータベースへの命令(SQL 文)を組み立てるときに、値の中の特別な記号を無害化しないために、命令の意味そのものが書き換えられてしまう脆弱性です(英語では SQL injection。SQLi と略す)。CISSP ではCISSPドメイン8 ソフトウェア開発のセキュリティで扱う、Web アプリケーションの代表的な脆弱性です。同じ「無害化の不足」の弱点にクロスサイトスクリプティングがあります。

定義

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