101 votes

Android/SQLite DANS la clause et les espaces réservés

Je suis d'essayer de faire la requête sql suivante dans android:

    String names = "'name1', 'name2";   // in the code this is dynamically generated

    String query = "SELECT * FROM table WHERE name IN (?)";
    Cursor cursor = mDb.rawQuery(query, new String[]{names});

Cependant, android n'est pas de remplacer le point d'interrogation avec les valeurs correctes. Je pourrais faire la suite mais cela ne protège pas contre les injections sql:

    String query = "SELECT * FROM table WHERE name IN (" + names + ")";
    Cursor cursor = mDb.rawQuery(query, null);

Comment puis-je obtenir autour de ce problème et être en mesure d'utiliser la clause?

Merci.

5voto

florian h Points 678

Malheureusement il n'y a aucun moyen de le faire (évidemment 'name1', 'name2' n'est pas une valeur unique et ne peut donc pas être utilisé dans une déclaration préparée à l'avance).

Donc, vous devrez réduire vos sites (par exemple, par la création de très spécifique, n'est pas réutilisable requêtes comme celles - WHERE name IN (?, ?, ?)) ou non à l'aide de procédures stockées et de tenter de prévenir les injections SQL avec quelques autres techniques...

0voto

Stan Points 1163

En fait, vous pourriez utiliser android natif moyen de l'interrogation à la place de rawQuery:

public int updateContactsByServerIds(ArrayList<Integer> serverIds, final long groupId) {
    final int serverIdsCount = serverIds.size()-1; // 0 for one and only id, -1 if empty list
    final StringBuilder ids = new StringBuilder("");
    if (serverIdsCount>0) // ambiguous "if" but -1 leads to endless cycle
        for (int i = 0; i < serverIdsCount; i++)
            ids.append(String.valueOf(serverIds.get(i))).append(",");
    // add last (or one and only) id without comma
    ids.append(String.valueOf(serverIds.get(serverIdsCount))); //-1 throws exception
    // remove last comma
    Log.i(this,"whereIdsList: "+ids);
    final String whereClause = Tables.Contacts.USER_ID + " IN ("+ids+")";

    final ContentValues args = new ContentValues();
    args.put(Tables.Contacts.GROUP_ID, groupId);

    int numberOfRowsAffected = 0;
    SQLiteDatabase db = dbAdapter.getWritableDatabase());
        try {
            numberOfRowsAffected = db.update(Tables.Contacts.TABLE_NAME, args, whereClause, null);
        } catch (Exception e) {
            e.printStackTrace();
        }
        dbAdapter.closeWritableDB();


    Log.d(TAG, "updateContactsByServerIds() numberOfRowsAffected: " + numberOfRowsAffected);

    return numberOfRowsAffected;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X