ホームページ >データベース >mysql チュートリアル >Android SQLクエリでIN句を安全にパラメータ化する方法は?
Android では、SQL クエリの実行には、SQL インジェクションの脆弱性を防ぐためにパラメーター化されたプレースホルダーを使用することがよくあります。これは、IN 句が使用されている場合に発生します。次のクエリを考えてみましょう:
<code>String names = "name1', 'name2"; // 动态生成 String query = "SELECT * FROM table WHERE name IN (?)"; Cursor cursor = mDb.rawQuery(query, new String[]{names});</code>
ただし、Android では疑問符を指定された値に置き換えることはできません。あるいは、以下を選択することもできます:
<code>String query = "SELECT * FROM table WHERE name IN (" + names + ")"; Cursor cursor = mDb.rawQuery(query, null);</code>
このアプローチでは SQL インジェクションの脅威は排除されますが、クエリを適切にパラメータ化できません。
インジェクションのリスクを回避しながらパラメータ化を実現するには、プレースホルダー パターンを持つ文字列の使用を検討してください。
<code>String query = "SELECT * FROM table WHERE name IN (" + makePlaceholders(names.length) + ")"; Cursor cursor = mDb.rawQuery(query, names);</code>
makePlaceholders(len) 関数は、必要な数の疑問符をカンマで区切って含む文字列を生成します。これにより、パラメータ化に影響を与えることなくクエリを安全に挿入できます。
makePlaceholders(len) の実装:
<code>String makePlaceholders(int len) { if (len < 1) { throw new IllegalArgumentException("Length must be > 0"); } StringBuilder sb = new StringBuilder(len * 2 - 1); sb.append("?"); for (int i = 1; i < len; i++) { sb.append(",?"); } return sb.toString(); }</code>
SQLite は、一部の特定の Android バージョンを除き、通常、最大 999 個のホスト パラメーターをサポートしていることに注意してください。
以上がAndroid SQLクエリでIN句を安全にパラメータ化する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。