2016-11-12 1 views
-2

Das Anhängen von Werten an die Auswahlzeichenfolge ist aus Sicherheitsgründen eine schlechte Vorgehensweise. Zum Beispiel:Warum unterstützt der SQLiteQueryBuilder auf Android keine ersetzbaren Parameter?

String selection = TableColumOne + " = " + whereValue; 

und folgend

empfohlen
String selection = TableColumOne + " = ?" 
    String[] selectionArgs = new String[] { whereValue} 

All Content-Provider-Beispiele, die ich gesehen habe ein SQLiteQueryBuilder benutzen, die nur geht voran und machen die ersten. Ist das nicht eine schlechte Praxis

public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, 
     String sortOrder) { 
    SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); 
    qb.setTables(NOTES_TABLE_NAME); 
    switch (sUriMatcher.match(uri)) { 
    case NOTE_ID: 
     qb.setProjectionMap(sNotesProjectionMap); 
     qb.appendWhere(NoteColumns._ID + "=" + uri.getPathSegments().get(1)); 
     break; 
     } 
     // If no sort order is specified use the default 
     String orderBy; 
     if (TextUtils.isEmpty(sortOrder)) { 
      orderBy = NoteColumns.DEFAULT_SORT_ORDER; 
     } else { 
      orderBy = sortOrder; 
     } 

     // Get the database and run the query 
     SQLiteDatabase db = mOpenHelper.getReadableDatabase(); 
     Cursor c = qb.query(db, projection, selection, selectionArgs, null,  null, orderBy); 

     // Tell the cursor what uri to watch, so it knows when its source data  changes 
     c.setNotificationUri(getContext().getContentResolver(), uri); 
     return c; 
    } 

Antwort

0

Sie sind willkommen Auswahl Argumente mit SQLiteQueryBuilder zu verwenden. In diesem Fall wird die Client der ContentProvider — was Code query() auf einem ContentResolver verwendet, die direkt oder indirekt — sehr gut einschließlich der Auswahl Argumente in selection sein könnte, mit den Werten in selectionArgs zu verwenden.

Ich gehe davon aus, dass diese Aussage ist, was Sie stört:

qb.appendWhere(NoteColumns._ID + "=" + uri.getPathSegments().get(1)); 

Der Entwickler verwendet haben könnte:

qb.appendWhere(NoteColumns._ID + "=?"); 

dann in einer anderen String[] zu query() verabschiedete den Anrufer enthält selectionArgs Plus uri.getPathSegments().get(1) . Das ist hier etwas riskant, da Sie nicht wirklich wissen, ob appendWhere() diese Klausel wirklich "anhängt", was dazu führt, dass ? nach irgendeinem vom Anrufer bereitgestellten ? liegt.

Werte in die Auswahl String Anfügen ist eine schlechte Praxis aus Sicherheitsgründen

Das ist ein viel größeres Problem für Web-Anwendungen ist.

In der mobilen Welt kommen häufig die Daten vom Benutzer. Wenn der Benutzer a Little Bobby Tables attack gegen die eigenen Apps des Benutzers ausführen möchte, ist dies das Vorrecht des Benutzers. Dieser Code scheint von einer ContentProvider Implementierung zu stammen. A ContentProvider kann oder darf nicht exportiert werden. Wenn die ContentProvider exportiert wird, damit Anwendungen von Drittanbietern damit arbeiten können, sollte insert() mehr Eingabebereinigung durchführen. Das muss nicht unbedingt Auswahlargumente beinhalten, obwohl es möglich wäre. Wenn der ContentProvider jedoch nicht exportiert wird, solange der Entwickler zuversichtlich ist, dass der Uri nie einen ungültigen Wert für getPathSegments().get(1) haben wird, gibt es keinen besonderen Grund, sich über die Verwendung von Auswahlargumenten zu sorgen.

Verwandte Themen