SQLインジェクション攻撃は、Webアプリケーションが適切にユーザー入力を検証・エスケープしていない場合に発生する深刻な脆弱性です。攻撃者は細工したユーザー入力を介してSQLクエリを改ざんし、データベースへの不正アクセスやデータ改ざん、システムの乗っ取りなどを行うことができます。
攻撃例
- 認証バイパス
- ユーザー名:
admin' --
- パスワード:
任意の文字列
- これにより
SELECT * FROM users WHERE username='admin' -- ' AND password='...
となり、後半のANDが無視される
- データ盗難
- ウェブサイトのURLに
?id=1 UNION SELECT credit_card,... FROM users
を埋め込む - これにより別のSELECT文が実行され、クレジットカード情報などが漏洩する可能性
- データ改ざん
username=admin'; UPDATE users SET is_admin=1 WHERE 'a'='a
WHERE 'a'='a'
は常に真となり、全ユーザーが管理者に設定される
防御策
- プリペアドステートメントの使用
- SQLクエリとユーザー入力を分離する
- ユーザー入力はプレースホルダに渡し、SQLインジェクションを防ぐ
- 入力値の適切なエスケープ処理
- ユーザー入力を適切にエスケープし、SQLリテラルとして解釈されないようにする
'
を\'
に置換するなど
- 最小権限の原則
- アプリケーションはデータベースに対して最小限の権限でアクセスするよう設定する
- ホワイトリスト入力値検証
- 許可する値のホワイトリストを作成し、それ以外の値は拒否する
- ORM(オブジェクトリレーショナルマッピング)の適切な使用
- ORMライブラリが提供するパラメータバインディングを利用する
- エラーメッセージの制限
- エラーメッセージでデータベース構造が漏れないよう、最小限の情報のみを表示する
- WAFの活用
- Webアプリケーションファイアウォール(WAF)でSQLインジェクションの検知と防御を行う
- 教育
- 開発者に対するセキュリティ教育を徹底し、危険性の理解を促す
SQLインジェクションは深刻な脆弱性ですが、適切な対策を施すことでリスクを大幅に低減できます。定期的な脆弱性スキャンと最新のセキュリティアップデートの適用も重要です。