Android SQL IN 句の保護
SQL インジェクションを防ぐことは、SQL クエリ、特に IN
句を使用するクエリを構築する場合に最も重要です。 Android の rawQuery
メソッドはプレースホルダー (?) を使用しますが、それをユーザーが提供したデータに直接置き換えることは重大なセキュリティ リスクです。
堅牢な解決策には、IN
句のパラメータ化が含まれます。 このアプローチでは、生成されたプレースホルダー文字列を使用し、SQL クエリ自体にユーザー入力が直接組み込まれることを回避します。
安全なアプローチ:
プレースホルダーの生成: 正しい数のプレースホルダー (?) を含む文字列を作成します。 makePlaceholders(int len)
のようなヘルパー関数は、len
疑問符のカンマ区切り文字列を生成します。この関数により、プレースホルダー文字列が一貫してフォーマットされ、ユーザー指定のデータが含まれないことが保証されます。
クエリを構築します: 生成されたプレースホルダー文字列を SQL クエリに統合します:
<code class="language-sql">String query = "SELECT * FROM table WHERE name IN (" + makePlaceholders(names.length) + ")";</code>
準備とバインド: クエリを準備し、動的値を配列としてバインドします:
<code class="language-java">Cursor cursor = mDb.rawQuery(query, names);</code>
重要なことは、names
配列内の値の数は、生成されたプレースホルダーの数と正確に一致する必要があります。
コード例:
makePlaceholders
関数の実装例を次に示します。
<code class="language-java">public static String makePlaceholders(int len) { StringBuilder sb = new StringBuilder(len * 2 - 1); sb.append("?"); for (int i = 1; i < len; i++) { sb.append(",?"); } return sb.toString(); }</code>
このメソッドはプレースホルダー文字列を動的に構築し、安全なクエリ実行を保証します。 パラメータ化されたクエリを使用すると、SQL インジェクションの脆弱性を効果的に軽減し、Android データベースを保護できます。
以上がAndroid で SQL IN 句を安全にパラメータ化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。