comment générer en toute sécurité une instruction SQL db-comme l'utilisation de api python
-
21-09-2019 - |
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?
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,) )