ホームページ >データベース >mysql チュートリアル >Android SQLクエリでIN句を安全にパラメータ化する方法は?

Android SQLクエリでIN句を安全にパラメータ化する方法は?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-18 17:32:09449ブラウズ

How to Safely Parameterize the IN Clause in Android SQL Queries?

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 インジェクションの脅威は排除されますが、クエリを適切にパラメータ化できません。

パラメータ化された IN 句

インジェクションのリスクを回避しながらパラメータ化を実現するには、プレースホルダー パターンを持つ文字列の使用を検討してください。

<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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。