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
Libérer: 2025-01-18 17:32:09
original
445 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion
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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal