0

Le rapport d'analyse statique Veracode pointe les erreurs d'injection SQL dans mon implémentation de fournisseur de contenu.Comment désinfecter toutes les variables passées au tableau selectionArgs?

Auparavant, j'ai posté ce question lié à tous mes doutes concernant cette faille. Et après quelques discussions, je suis arrivé à la conclusion qu'il pourrait y avoir des chances que ce soit un faux positif dans le rapport. Parce que selon ce que j'ai recherché et lu, je suivais les directives de sécurité mentionnées dans Android docs et other referenced sources pour éviter l'injection SQL.

Il est suggéré partout d'effectuer au moins une validation d'entrée sur les données passées aux requêtes SQL. Je veux couvrir cette possibilité qui est la raison de la faille. Tout le monde me demande d'assainir les données avant de passer à la requête. Comment est-ce que je désinfecte exactement les variables passées au tableau selectionArgs passé à la méthode delete(), update() de Content Provider?

Est-ce que DatabaseUtils.sqlEscapeString() sera suffisant? Veuillez nous suggérer!

est ici la mise en œuvre où je dois désinfectez la variable:

public Loader<Cursor> onCreateLoader(int id, Bundle b) { 
    switch (id) { 
     case THOUGHT_LOADER: 
      return new CursorLoader(getActivity(), NewsFeedTable.CONTENT_URI, NewsFeedTable.PROJECTION, NewsFeedTable._id + "=?", new String[]{tid}, null); 
     case COMMENT_LOADER: 
      return new CursorLoader(getActivity(), CommentTable.CONTENT_URI, CommentTable.PROJECTION, CommentTable.COLUMN_TID + "=?", new String[]{tid}, null); 
     default: 
      return null; 
    } 
} 

points de rapport à la faille: Neutralisation incorrecte d'éléments spéciaux utilisés dans une commande SQL ('injection SQL') (CWEID 89) à cette ligne

supprimé = db.delete (BulletinTable.TABLE_NAME, sélection, selectionArgs); dans le code ci-dessous:

@Override 
public int delete(Uri uri, String selection, String[] selectionArgs) { 
    if (uri.equals(Contract.BASE_CONTENT_URI)) { 
     deleteDatabase(); 
     return 1; 
    } 

    SQLiteDatabase db = openHelper.getWritableDatabase(); 

    int deleted = 0; 
    switch (matcher.match(uri)) { 
     case BULLETIN: 
      deleted = db.delete(BulletinTable.TABLE_NAME, selection, selectionArgs); 
      break; 
     case CLASSROOMS: 
      deleted = db.delete(ClassroomsTable.TABLE_NAME, selection, selectionArgs); 
      break; 
     default: 
      throw new IllegalArgumentException("Unsupported URI: " + uri); 
    } 

    if (deleted > 0) { 
     getContext().getContentResolver().notifyChange(uri, null); 
    } 

    return deleted; 
} 
+0

@CL, j'ai ajouté l'extrait de code où les rapports points défaut dans la question. Il ne se plaint d'aucune valeur spécifique, mais donne seulement les numéros de ligne dans le code où cette faille a été détectée avec des détails concernant la faille et quelques recommandations. C'est la méthode delete() de l'implémentation Content Provider. J'ai supprimé l'image et ajouté du code à sa place. – Priya

+0

Qu'ont ces deux morceaux de code à faire l'un avec l'autre?Où est-ce que 'delete' est appelé? Et pourquoi n'est-ce pas une copie de votre question précédente? –

+0

Oui, ce sont deux morceaux de code différents. Ils n'ont rien à faire l'un avec l'autre. Premier extrait de code: _Affiche l'implémentation comment je passe des variables dans selectionArgs Array._ Deuxième extrait de code: _Points où la faille est détectée._ Marquer comme Dupliquer: Peut-être que cette question peut être considérée comme doublon.Mais j'essayais de obtenir la réponse de mon autre question sur la désinfection des données. Donc, j'ai pensé à créer une question différente. – Priya

Répondre

1

Les valeurs du tableau selectionArgs jamais besoin d'être aseptisé, parce qu'ils ne peuvent pas être interprétées comme des commandes SQL (qui est le point entier d'avoir des valeurs de paramètres séparés).

sqlEscapeString() Le but de sqlEscapeString() est de formater une chaîne afin qu'elle puisse être placée dans une commande SQL (c'est-à-dire, échappement de guillemets simples, tous les autres caractères n'ayant aucune signification dans une chaîne SQL). Mais quand vous savez qu'il y a une chaîne, vous devriez plutôt selectionArgs, donc cette fonction n'est pas utile.

Vous devez nettoyer uniquement les chaînes qui se retrouvent dans la commande SQL elle-même. Dans ce cas, ce serait selection. Si cette valeur provient de l'utilisateur ou d'une autre application, vous n'avez aucun contrôle sur la quantité de choses que fait réellement votre instruction DELETE (elle peut appeler des fonctions SQL ou exécuter des sous-requêtes accédant à d'autres parties de la base de données). Pour des raisons pratiques, il n'est pas possible d'assainir les chaînes destinées à contenir des commandes SQL, car vous auriez besoin d'un analyseur SQL complet. Si votre fournisseur de contenu est disponible pour du code externe, vous devez autoriser la suppression d'éléments spécifiques uniquement via l'URI et interdire les codes personnalisés selection.