Maison >base de données >tutoriel mysql >Comment paramétrer en toute sécurité la clause IN dans les requêtes SQL Android ?

Comment paramétrer en toute sécurité la clause IN dans les requêtes SQL Android ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-18 17:32:09447parcourir

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

Clause IN et énigme des espaces réservés dans les requêtes SQL Android

Sous Android, l'exécution de requêtes SQL implique souvent l'utilisation d'espaces réservés paramétrés pour éviter les vulnérabilités d'injection SQL. Cela se produit lorsqu'une clause IN est utilisée. Considérez la requête suivante :

<code>String names = "name1', 'name2";   // 动态生成
String query = "SELECT * FROM table WHERE name IN (?)";
Cursor cursor = mDb.rawQuery(query, new String[]{names});</code>

Cependant, Android ne peut pas remplacer le point d'interrogation par la valeur fournie. Alternativement, vous pouvez choisir :

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

Bien que cette approche élimine la menace d'injection SQL, elle ne parvient pas à paramétrer correctement la requête.

Clause IN paramétrée

Pour réaliser le paramétrage tout en évitant les risques d'injection, pensez à utiliser des chaînes avec des motifs fictifs :

<code>String query = "SELECT * FROM table WHERE name IN (" + makePlaceholders(names.length) + ")";
Cursor cursor = mDb.rawQuery(query, names);</code>
La fonction

makePlaceholders(len) génère une chaîne contenant le nombre requis de points d'interrogation, séparés par des virgules. Cela permet d'insérer des requêtes en toute sécurité sans affecter le paramétrage.

Implémentation de 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>

Veuillez noter que SQLite prend généralement en charge jusqu'à 999 paramètres d'hôte, sauf dans certaines versions spécifiques d'Android.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn