インジェクション攻撃
SQLインジェクション・コマンドインジェクション・LDAPインジェクションなどの攻撃手法と防御パターン
インジェクション攻撃とは、アプリケーションがユーザー入力をコマンドやクエリとして解釈することによって発生する脆弱性の総称であり、SQLインジェクションはOWASP Top 10の最上位に長年位置してきた最も危険な脆弱性カテゴリである。攻撃者は入力フィールドに特殊文字やコマンド断片を挿入することで、意図しないSQLクエリ・OSコマンド・LDAPクエリ等を実行させることができる。インジェクション攻撃の共通した防御原則は、データとコードを明確に分離し、ユーザー入力をコードとして解釈させないことである。
SQLインジェクションの唯一の確実な対策はパラメータ化クエリ(プリペアドステートメント)であり、ユーザー入力が常にパラメータとして扱われSQL構文の一部にならないことを保証する。ORMや文字列エスケープによる対策は、設定ミスや特殊なケースで機能しないことがあるため、パラメータ化クエリを基本とすることが推奨される。コマンドインジェクションはexec()・eval()・shell_exec()などのシェル実行関数にユーザー入力を渡すことで発生し、OSコマンドの任意実行につながる最も危険なインジェクションの一つである。
NoSQLデータベース(MongoDB等)も$where・$gt等のクエリオペレータを使ったインジェクションが可能であり、「SQLを使っていないから安全」という思い込みは危険である。2次インジェクション(Second-Order Injection)は、DBに一度保存された入力値が別のクエリで安全でない方法で使われる際に発生する問題であり、データの保存時ではなく利用時にパラメータ化が必要になるケースである。
コードレビューで着目するポイント
- DBクエリがすべてパラメータ化クエリまたはORMの安全なメソッドで構築されているか(文字列連結でのクエリ組み立てがないか)
exec()・child_process.exec()・subprocess.call()等の関数にユーザー入力が直接渡されていないか- ORM利用時に生のクエリ文字列を使う
raw()・query()等のメソッドがパラメータ化されているか - MongoDBなどNoSQLのクエリでユーザー入力がオペレータ(
$where・$gt等)として解釈されないようになっているか - LDAP検索フィルタにユーザー入力が含まれる場合、適切なエスケープが行われているか
- XMLを処理する際にXXE(XML External Entity)対策として外部エンティティ処理が無効化されているか
典型的なアンチパターン
文字列連結によるSQL組み立て: "SELECT * FROM users WHERE name = '" + userName + "'" のように文字列連結でクエリを組み立てる実装。userNameに ' OR '1'='1 を入力されると全レコードが返ってしまう。プリペアドステートメントでWHERE name = ?と記述し、入力値はパラメータとして渡すこと。
shell経由の外部コマンド実行: exec("convert " + userFileName) のようにユーザー指定のファイル名をコマンドに含める実装。userFileNameにimage.jpg; rm -rf /を指定されるとOSコマンドが実行される。コマンド実行が必要な場合は引数配列形式(execFile(cmd, [arg1, arg2]))を使いシェル解釈を避けること。
ORMのraw()への無検証入力: ORMで通常は安全に処理されるが、複雑なクエリのためにUser.query("WHERE " + userFilter)のようにraw文字列メソッドにユーザー入力を直接渡す実装。ORMの安全なAPIを使って表現できない場合もパラメータ化は維持できる。
参考リソース
- OWASP SQL Injection Prevention Cheat Sheet — SQLインジェクション防御の包括的ガイド
- OWASP Command Injection Defense Cheat Sheet — コマンドインジェクション防御の実装ガイド
- OWASP Top 10: A03 Injection — インジェクション脆弱性の最新分類と事例
- SQLMap (https://sqlmap.org/) — SQLインジェクション自動検出ツール(ペネトレーションテスト用)
- Bobby Tables (https://bobby-tables.com/) — SQLインジェクション対策の言語別サンプルコード集
- 1. 📄アーキテクチャスタイル
- 2. 📄ドメインモデリング
- 3. 📄モジュール分割と依存管理
- 4. 📄データモデリング
- 5. 📄API設計
- 6. 📄整合性とトランザクション
- 7. 📄非同期処理(Queue/Event)
- 8. 📄キャッシング
- 9. 📄ユーザーリサーチ
- 10. 📄情報アーキテクチャ
- 11. 📄インタラクションデザイン
- 12. 📄UX原則とヒューリスティクス
- 13. 📄アクセシビリティ(UX観点)
- 14. 📄UXメトリクス
- 15. 📄スケーラビリティ
- 16. 📄可用性とレジリエンス
- 17. 📄オブザーバビリティ
- 18. 📄環境・インフラ設計
- 19. 📄データマイグレーション
- 20. 📄セキュリティ設計原則
- 21. 📄データ保護とマルチテナント
- 22. 📄LLMセキュリティ
- 23. 📄ビジュアルデザイン原則
- 24. 📄デザインシステム
- 25. 📄コンポーネント設計
- 26. 📄スタイリング
- 27. 📄設計原則
- 28. 📄デザインパターン(GoF)
- 29. 📄エンタープライズパターン
- 30. 📄クリーンコード
- 31. 📄リファクタリング
- 32. 📄型設計とコントラクト
- 33. 📄関数型プログラミング概念
- 34. 📄エラーハンドリング
- 35. 📄テスト戦略と哲学
- 36. 📄テスト種別(機能テスト)
- 37. 📄テスト種別(UI・ビジュアル)
- 38. 📄テスト種別(契約・境界)
- 39. 📄並行処理・マルチスレッド
- 40. 📄パフォーマンス最適化
- 41. 📄ドキュメント管理
- 42. 📄バージョン管理と開発プロセス
- 43. 📄脅威モデリング
- 44. 📄通信保護(TLS)
- 45. 📄暗号化・機密情報管理
- 46. 📄認証・セッション管理
- 47. 📄認可・アクセス制御
- 48. 📄入力バリデーション
- 49. 📄インジェクション攻撃
- 50. 📄正規化(データベース正規化)