1. 基本的な条件式の設定 — where メソッド
where メソッドは特定の条件に合うレコードを検索するときに使用します。
- SQLのWHERE節に相当し、シンプルなハッシュ構文または文字列を使って条件を指定可能です。
使用方法
- ハッシュ構文の使用: 最もシンプルで安全な方法であり、SQLインジェクション攻撃に対する耐性があります。
- 文字列の使用: より複雑なクエリを実行できますが、インジェクション攻撃に弱くなるため注意が必要です。
- 通常はプレースホルダーと一緒に使用します。
例
User.where(name: 'Alice')
User.where("age >= ?", 25)
User.where(created_at: (Time.now.midnight - 1.week)..Time.now.midnight)
- データをフィルタリングして特定の基準に合うレコードのみを取得できるため、データ処理が簡単になります。
- 直感的なAPIを通じて、SQLクエリを直接書かずに複雑なクエリを構成可能です。
2. プレースホルダーを使用した条件式の作成 — where メソッド
- プレースホルダーを使用した
where メソッドは、SQLインジェクション攻撃を防ぎながら動的なクエリ構成に役立ちます。
- ユーザーの入力を安全にクエリに反映可能です。
使用方法
- プレースホルダーの使用: クエリ文字列で '?' マークを使用し、二番目の引数に該当の値を渡してクエリを構成します。
例
name = params[:name]
User.where("name = ?", name)
age = params[:age]
User.where("name = ? AND age >= ?", name, age)
- セキュリティが強化されます => ユーザー入力をそのままクエリに使用せず、プレースホルダーを通じて処理します。
- 柔軟性が向上します => 様々なユーザー入力をクエリに簡単に統合可能です。
※ インジェクション攻撃
- 悪意のあるユーザーがアプリケーションに予想外の、または悪意のあるデータを「注入」して、アプリケーションが予想した通りに動作しないようにする攻撃タイプです。
- 主にデータベース、スクリプト、命令実行など様々なコンピューティング環境で発生します。
- 結果としてデータ漏洩、損傷、権限昇格など重大なセキュリティ脅威を引き起こします。
主なインジェクション攻撃のタイプ
- SQLインジェクション (SQL Injection)
- アプリケーションのセキュリティで最も一般的に見られるタイプの一つで、悪意のあるSQLコードをデータベースクエリに注入してデータベースを操作または機密情報を盗み出します。
- 例えば、ユーザー入力をフィルタリングせずにデータベースクエリに直接使用する場合、攻撃者は正常な入力値の代わりにSQL命令を注入可能です。
- スクリプトインジェクション (Script Injection)
- ウェブアプリケーションでよく見られる攻撃方式で、悪意のあるスクリプトコードをウェブページに注入します。
- この攻撃は主にクロスサイトスクリプティング(XSS)攻撃を通じて行われます。
- コマンドインジェクション (Command Injection)
- システム命令を実行できる機能に悪意のある命令を注入して、システムに無断でアクセスまたは操作します。
防御技術
- 入力検証: ユーザーから受け取ったすべての入力を検証し、予想される形式に合わない入力は拒否します。
- 予想される入力のみ許可: 入力フィールドに特定の形式や値のみを許可して、予想外の入力を事前にブロックします。
- 特殊文字のエスケープ処理: SQLクエリや命令実行などで使用可能な特殊文字を適切にエスケープ処理して、これらの文字がコードとして解釈されないようにします。
- セキュリティ強化されたライブラリの使用: データベースアクセスには、パラメータ化されたクエリやORM(Object-Relational Mapping)などのセキュリティ強化されたライブラリを使用します。