2016-11-12 20 views
-2

選択文字列に値を追加するのは、セキュリティ上の理由から悪い習慣です。たとえば:Android上のSQLiteQueryBuilderが置き換え可能なパラメータをサポートしないのはなぜですか?

String selection = TableColumOne + " = " + whereValue; 

と、次は私が先に行くと最初に行いSQLiteQueryBuilderを使用し見てきました

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

すべてのコンテンツプロバイダの例をお勧めします。これは悪い習慣ではありません

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; 
    } 

答えて

0

SQLiteQueryBuilderで選択引数を使用することは歓迎します。直接的または間接的に—非常によくselectionArgsで使用する値で、selectionにおける選択の引数を含むことができ、ContentResolverquery()を使用どんなコードContentProvider —のこの場合は、クライアント

私はこの声明があなたを邪魔するものであると仮定しています:

qb.appendWhere(NoteColumns._ID + "=" + uri.getPathSegments().get(1)); 
開発者が使用している可能性が

​​

が、その後含む、異なるString[]query()に渡され、発信者のselectionArgsプラスuri.getPathSegments().get(1)appendWhere()がその句を実際に「追加」して、?が呼び出し側が指定した?のいずれかの後になるようにしているかどうか分からない限り、ここではやや危険です。選択文字列に値を追加は

は、Webアプリケーションのための非常に大きな問題であるセキュリティ上の理由から

に悪い習慣です。

モバイルの世界では、頻繁にデータがユーザーから届いています。ユーザーが自分のアプリに対してa Little Bobby Tables attackを実行したい場合は、それがユーザーの特権です。

このコードはContentProvider実装からのものと思われます。 ContentProviderはエクスポートされる場合とされない場合があります。 ContentProviderをエクスポートしてサードパーティ製のアプリケーションでも使用できるようにすると、insert()はさらに多くの入力サニタイズを行う必要があります。それは必ずしも選択議論を含む必要はありませんが、それは可能です。しかし、ContentProviderがエクスポートされていない場合、の値がUriに決して悪くないことを開発者が確信している限り、選択引数の使用について心配する特別な理由はありません。

関連する問題