recherche

Maison  >  Questions et réponses  >  le corps du texte

Imbriquer une liste dans la clause IN dans Python MySQL

<p>Je sais comment mapper une liste sur une chaîne : </p> <pre class="brush:php;toolbar:false;">foostring = ",".join( map(str, list_of_ids) )</pre> <p>Je sais que je peux mettre cette chaîne dans une clause IN en utilisant : </p> <pre class="brush:php;toolbar:false;">cursor.execute("DELETE FROM foo.bar WHERE baz IN ('%s')" % (foostring))</pre> <p>Je dois implémenter la même fonctionnalité dans une base de données MySQL de manière sûre (en évitant l'injection SQL). Dans l'exemple ci-dessus, comme foostring n'est pas passé en paramètre à exécuter, il est vulnérable. Je dois également citer et m'échapper en dehors de la bibliothèque MySQL. </p> <p> (Il existe une question SO connexe, mais les réponses qui y sont répertoriées ne fonctionnent pas avec les bases de données MySQL ou sont vulnérables aux attaques par injection SQL.) </p>
P粉781235689P粉781235689505 Il y a quelques jours523

répondre à tous(2)je répondrai

  • P粉434996845

    P粉4349968452023-08-23 15:50:40

    Bien que cette question soit ancienne, je voulais laisser une réponse au cas où quelqu'un d'autre chercherait également ce que je recherche

    La réponse acceptée devient confuse lorsque nous avons beaucoup de paramètres ou que nous souhaitons utiliser des paramètres nommés

    Après quelques tentatives

    ids = [5, 3, ...]  # id列表
    cursor.execute('''
    SELECT 
    ...
    WHERE
      id IN %(ids)s
      AND created_at > %(start_dt)s
    ''', {
      'ids': tuple(ids), 'start_dt': '2019-10-31 00:00:00'
    })
    

    Testé et réussi sous python2.7pymysql==0.7.11

    répondre
    0
  • P粉212114661

    P粉2121146612023-08-23 00:26:09

    Utiliser directementlist_of_ids :

    format_strings = ','.join(['%s'] * len(list_of_ids))
    cursor.execute("DELETE FROM foo.bar WHERE baz IN (%s)" % format_strings,
                    tuple(list_of_ids))

    De cette façon, vous pouvez éviter de vous citer et éviter divers problèmes d'injection SQL.

    Notez que les données (list_of_ids) sont transmises directement au pilote MySQL en tant que paramètres (pas dans le texte de la requête), il n'y a donc pas de problèmes d'injection. Vous pouvez conserver tous les caractères de la chaîne sans les supprimer ni les citer.

    répondre
    0
  • Annulerrépondre