J'ai ce code:paramètre python sqlite3 passant question
conn = sqlite3.connect("testDB")
curs = conn.cursor()
curs.execute("CREATE TABLE IF NOT EXISTS testTable(col1 VARCHAR, col2 VARCHAR)")
c1 = "value1"
c2 = "value2"
curs.execute("INSERT INTO testTable VALUES (?,?)", (c1, c2))#this works fine
conn.commit()
def inDB(curs, table, col, value):
curs.execute("SELECT * FROM ? WHERE ?=?",(table, col, value)) #problemis here
return bool(curs.fetchone())
print inDB(curs, "testTable", "col1", c1)
Il me donne cette erreur:
Traceback (most recent call last):
File "test.py", line 16, in <module>
print inDB(curs, "testTable", "col1", c1)
File "test.py", line 13, in inDB
curs.execute("SELECT * FROM ? WHERE ?=?",(table, col, value))
sqlite3.OperationalError: near "?": syntax error
Pourquoi cela ne fonctionne pas et comment puis-je résoudre ce problème?
Si vous utilisez la concaténation de chaîne n'est pas vulnérable pour SQLi si j'utilise du code pour une application web? – torayeff
bien, peut-être ... mais je ne sais pas mieux quand vous voulez changer dynamiquement le nom de la table ... Si vous craignez l'injection SQL, vous pouvez créer plusieurs fonctions avec un nom de table fixe quelque chose comme: 'void addToTable1 (value1, value2) { ("INSERT INTO table1 VALEURS (?,?)", (valeur1, valeur2)); } ' ' void addToTable2 (valeur1, valeur2) { ("INSERT INTO table2 VALEURS (?,?)", (Valeur1, valeur2)); } ' – Slimer
Quoi qu'il en soit, comment peut-on injecter le nom de la table ... Transmettez-vous le nom de la table comme argument à partir de l'entrée de l'utilisateur? Le nom de la table est supposé être une chose interne. Seule l'application elle-même doit connaître les noms des tables et seule l'application elle-même doit définir le paramètre (dans votre cas) 'testTable' à partir d'une liste connue. – Slimer