Sto lavorando a un progetto che richiede di creare a livello di codice utenti MySQL da un'app django. Posso creare gli utenti bene:Impedisci a MySQL-Python di inserire virgolette sul parametro nome del database
from django.db import connection, transaction
cursor = connection.cursor()
cursor.execute("CREATE USER %[email protected]'%'", 'username')
cursor.execute("SET PASSWORD FOR %[email protected]'%' = PASSWORD(%s)", ('username', 'pass'))
Che funziona perfettamente. Il problema è quando provo a concedere le autorizzazioni. Il nome del database è anche determinato a livello di codice:
cursor.execute("GRANT SELECT ON %s.* TO %[email protected]'%'", ('dbname', 'username'))
Questo si traduce in un errore di mysql, perché quando lo fa la sostituzione di stringhe, pone apici intorno al nome del database, che è sintatticamente corretto:
DatabaseError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''dbname'.* to 'username'@'%'' at line 1")
Come impedire che le virgolette singole vengano aggiunte attorno allo %s
per il nome del database? So che potrei semplicemente eseguire la sostituzione delle stringhe in Python e risolvere il problema, ma ciò potrebbe potenzialmente causare una vulnerabilità di SQL injection.
Sembra che potrebbe non essere possibile. Secondo i documenti mysql-python: _Parameter placeholders può essere utilizzato solo per inserire valori di colonna. Non possono essere utilizzati per altre parti di SQL, come nomi di tabelle, istruzioni, ecc ._ – dgel