IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

SQLITE injection avec une liste d'arguments


Sujet :

Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 34
    Par défaut SQLITE injection avec une liste d'arguments
    Bonjour à tous!

    Je me bat depuis plusieurs jour avec une commande python 3.2 et une commande SQL.
    si je code en dur la requête cela marche (j'utilise la concatenation pour arriver à mes fins),
    mais d'après ce que j'ai vu sur plusieurs forum, pour des raison de sécurité, la "concatenation" de chaîne de texte pour obtenir une commande SQL est à proscrire (risque d'injection de code).


    l'idée de ma fonction est la suivante:
    dans ma Db j'ai une colonne "Designation" qui peux contenir une phrase (liste de produit), l'utilisateur, rédige dans un champ de saisi une liste de mot clé, cette liste est envoyé à ma fonction, et SQLITE me renvoie une liste d'enregistrement qui contienne ces mot clés
    ci-dessous mon code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        def filter(self, string):
            liste = tuple(string.split())
            sql = " SELECT rec.Designation FROM RECETTE rec WHERE  {seq}; ".format(
                seq=' AND '.join(["rec.Designation LIKE '%?%' "] * len(liste)))
     
            print (sql)
            self.curseur.execute(sql, (liste,))
    le message d'erreur renvoyé par SQLITE

    "sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 0, and there are 2 supplied."
    question est-ce que ce problèeme est liée à SQLITE ?


    Par avance merci.

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Bonjour,

    En admettant que vous utilisez sqlite3,

    La documentation donne une idée de ce que vous devez faire et surtout la manière dont vous devez le faire.

    Maintenant si vous ne respectez pas ce format, il ne faut pas s'étonner que ça ne fonctionne pas

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 34
    Par défaut
    Merci pour le retour, et le lien vers la doc... par contre je ne comprends pas l'aspect "formalisme " de votre réponse j'ai l'impression de l'avoir respecté (au parenthèses pré mais dans mes différents essais elle y sont passée ...)

    Nota :la doc me donne la solution pour un nombre fini de paramètre, pour ma part, je ne connais pas par avance le nombre de paramètres demandé par l'utilisateur, d'ou l'utilisation de la fonction "join" dans mon "format". j'ai le droit à ça ou pas ?

    après plusieurs test, pour arriver à un résultat correct, je suis obligé d'ajouter les "%" non plus dans la commande SQL mais dans la liste injecté dans la commande SQL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tmp=[]
            for elm in string.split():
                tmp.append("%{}%".format(elm))
            liste=tuple(tmp)
    et ma commande SQL devient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sql = " SELECT rec.Designation FROM RECETTE rec WHERE  {seq}; ".format(
                seq=' AND '.join(["rec.Designation LIKE (?) "] * len(liste)))
    est-ce normal ou je me suis pris les pieds dans le tapie ?

    par avance merci.

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Découpez votre code,

    Le résultat de,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ' AND '.join(["rec.Designation LIKE '%?%' "] * len(liste))
    fait-il ce que vous souhaitez ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 34
    Par défaut
    Pour avoir un résultat qui correspond à mes attentes, j'ai besoin des "%" de la fonction LIKE.
    de plus qu est ce que vous entendez par "decoupez votre code ?"

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Et avec l'opérateur IN ?

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 34
    Par défaut
    l'opérateur 'IN', sauf erreur de ma part est l'équivalent d'un "OU", moi je cherche un "ET"

    si je reviens sur mon pseudo exemple,

    |DESIGNATION|
    |oeuf beurre chocolat |
    |tomate oignon beurre|
    | salade oeuf |

    l'idée est si l'utilisateur entre oeuf et chocolat dans la liste, il me retourne seulement la ligne 1.

  8. #8
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Tu as qu'une seule colonne ?

    Si c'est le cas, il faut récupérer l'ensemble des lignes, splitter et tester avec du python. Pour moi dans ce cas, il n'y a pas besoin d'opérateur logique dans la requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT designation FROM table;

  9. #9
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,

    Vous avez plusieurs problèmes.
    Le premier est de passer des '%' pour entourer le paramètre qui sera passé au LIKE.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .execute("SELECT .... LIKE ?", ('%' + string + '%', ))
    le 2nd est d'en mettre plusieurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> 'select...' + ' OR '.join(['like ?'] * 2)
    'select...like ? OR like ?
    '
    Et voilà comment on décompose...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. [MySQL] Problème avec une liste déroulante
    Par leloup84 dans le forum SQL Procédural
    Réponses: 19
    Dernier message: 24/01/2006, 12h57
  2. Réponses: 7
    Dernier message: 24/01/2006, 11h03
  3. alligner des textbox (input) avec une liste
    Par sundjata dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 20/01/2006, 15h16
  4. Remplir 3 champs textes différents avec une liste déroulante
    Par azorol dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 20/12/2005, 00h04
  5. fonctions stockées avec une table en argument
    Par bdkiller dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 08/10/2004, 23h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo