comment générer en toute sécurité une instruction SQL db-comme l'utilisation de api python

StackOverflow https://stackoverflow.com/questions/2097475

Question

Je suis en train de monter l'instruction SQL suivante en utilisant db-api de python:

SELECT x FROM myTable WHERE x LIKE 'BEGINNING_OF_STRING%';

où BEGINNING_OF_STRING devrait être un var python pour être rempli en toute sécurité via l'API DB. J'ai essayé

beginningOfString = 'abc'

cursor.execute('SELECT x FROM myTable WHERE x LIKE '%s%', beginningOfString) 
cursor.execute('SELECT x FROM myTable WHERE x LIKE '%s%%', beginningOfString)

Je suis d'idées; quelle est la bonne façon de le faire?

Était-ce utile?

La solution

Il est préférable de séparer les paramètres du sql si vous le pouvez. Ensuite, vous pouvez laisser le module db prendre soin de bon citer des paramètres.

sql='SELECT x FROM myTable WHERE x LIKE %s'
args=[beginningOfString+'%']
cursor.execute(sql,args)

Autres conseils

EDIT:

Comme Brian et Thomas ont noté, far meilleure façon de le faire serait d'utiliser:

beginningOfString += '%'
cursor.execute("SELECT x FROM myTable WHERE x LIKE ?", (beginningOfString,) )

depuis la première méthode laisse ouverte aux attaques par injection SQL.


gauche dans l'histoire:

Essayez:

cursor.execute("SELECT x FROM myTable WHERE x LIKE '%s%%'" % beginningOfString)

Prenez note de Sqlite3 documentation:

  

Habituellement, vos opérations SQL auront besoin   d'utiliser les valeurs des variables Python.   Vous ne devriez pas assembler votre requête   en utilisant les opérations de chaîne de Python   car cela est précaire; cela fait   votre programme vulnérable à un SQL   attaque par injection.

     

Au lieu de cela, utilisez le paramètre de l'API DB-   substitution. Mettre? comme un espace réservé   où que vous souhaitez utiliser une valeur, et   puis fournir un tuple de valeurs que la   Le deuxième argument des années curseur   méthode execute (). (Autre base de données   Les modules peuvent utiliser un autre   espace réservé, comme% s ou:. 1)   exemple:

# Never do this -- insecure!
symbol = 'IBM'
c.execute("... where symbol = '%s'" % symbol)

# Do this instead
t = (symbol,)
c.execute('select * from stocks where symbol=?', t)

# Larger example
for t in [('2006-03-28', 'BUY', 'IBM', 1000, 45.00),
          ('2006-04-05', 'BUY', 'MSOFT', 1000, 72.00),
          ('2006-04-06', 'SELL', 'IBM', 500, 53.00),
         ]:
    c.execute('insert into stocks values (?,?,?,?,?)', t)

Je pense que vous voulez ceci:

cursor.execute('SELECT x FROM myTable WHERE x LIKE '%?%', (beginningOfString,) )
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top