SQLインジェクションとは
SQLインジェクションとは、データベースと連携しているWebサイトの入力フォーム(ログイン画面や検索窓など)に、開発者が意図しない悪意のあるプログラム(SQL文)を注入(インジェクション)することで、データベースを不正に操作する攻撃手法です。Webアプリが入力された文字列を適切にチェックせずにそのままデータベースへの命令(SQL)の一部として組み立ててしまう脆弱性がある場合に発生します。この攻撃を受けると、データベースに保存されているIDやパスワードが盗まれたり、データが消去・改ざんされたりする恐れがあります。
具体例
ログイン用のID入力欄に「' OR '1'='1」という、常に正しい(真となる)条件を示すSQLの特殊な文字列を入力することで、パスワードを知らなくても認証処理をスルーし、他人のアカウントで勝手にログインできてしまう被害事例。
意図されたSQL: SELECT * FROM users WHERE id = 'user_input' AND pass = 'password';
悪用されたSQL: SELECT * FROM users WHERE id = '' OR '1'='1' AND pass = 'password';
('1'='1' は常に正しいため、IDとパスワードのチェックが無効化されてしまう)
もう少し詳しく
SQLインジェクション(SQL Injection)は、Webアプリケーションとデータベース管理システム(DBMS)の隙間を突く、代表的かつ強力なサイバー攻撃手法です。データベースと通信する多くのWebシステムは、ユーザーがフォームに入力した値(例えば顧客IDや商品カテゴリー名など)を動的にSQL文に組み込んで実行します。しかし、プログラムがその入力値の形式を制限しなかったり、文字列のエスケープ(無害化)を怠ったりしていると、入力値そのものが「SQL文の構造」を勝手に書き換えてしまいます。
この攻撃が成功すると、データベースの内部データがすべて流出する(機密性の侵害)、データが書き換えられる・削除される(完全性の侵害)、あるいはDBMSそのもののコマンド実行機能を通じてサーバー自体が乗っ取られるなど、致命的なセキュリティインシデントに直結します。
技術的な被害シナリオには、以下のようなものがあります。
・情報漏洩: 検索条件を強制的に「常に真(すべての行を出力する条件)」に変えることで、本来アクセス権のない他のユーザーの情報(パスワードや個人情報)を一覧表示させる。
・認証回避(不正ログイン): ログイン認証ロジックのSQLに真となる条件を注入し、パスワードの確認ロジックをバイパス(スルー)して、管理者権限でシステムに入り込む。
・データの改ざん・削除: 注入するSQLの中に「UPDATE」や「DROP TABLE」などのテーブル削除・データ書き換えコマンドを含め、システムを破壊する。
試験でのポイント
試験において「SQLインジェクション」は、具体的な動作原理(入力欄に「'(シングルクォーテーション)」や「OR '1'='1'」が入力された場合のSQLの挙動)を問う問題や、その脆弱性を排除するための「根本的対策」を問う問題が非常によく出題されます。
・静的プレースホルダ(バインド機構)の利用: SQLインジェクションの最も根本的で効果的な対策は、「静的プレースホルダ」を利用することです。これは、プログラム側でSQL文の骨組み(コマンドの構造)をあらかじめ定義しておき、後からユーザーが入力したパラメータを「単なる値(データ)」として別枠で流し込む技術です。どれほど悪意あるSQL文が入力されても、それは単なるデータとして扱われるため、SQLの構造が変化することは絶対にありません。試験ではこの手法が最優先される対策である点を選択肢から選べるようにしてください。
・サニタイジング(エスケープ処理): SQL内で特別な意味を持つ記号(「'」や「\」など)を、単なる文字として扱わせるための無害化処理です。ただし、実装漏れのリスクがあるため、プレースホルダと併用することが推奨されます。
・WAF(Web Application Firewall)の導入: Webサーバーの手前で不正なSQLクエリ(シグネチャ)を含むパケットを検知して遮断する対策です。
試験問題では、「SQL文の組み立て」「プレースホルダの利用」「データベースの不正操作」といったフレーズと強く紐付けておくことが得点力に繋がります。
関連する用語
リレーショナルデータベースを操作するための問い合わせ言語「SQL」、Webアプリの脆弱性を突く他の代表的攻撃手法「クロスサイトスクリプティング(XSS)」、Webアプリ層の通信を監視して不正クエリを防ぐ「WAF」などがあります。