2012-04-09 2 views
6

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.

+1

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

risposta

6

A volte i segnaposto non funzionano (come hai scoperto), quindi dovrai utilizzare la concatenazione di stringhe. Fai attenzione: convalida la stringa, assicurati che sia composta solo dai caratteri che ti aspetti (non cercare solo caratteri che non ti aspetti), e dovresti essere OK. Chiedi a un altro sviluppatore di controllare il tuo codice e commentalo per assicurarti che nessun altro pensi che dovresti usare i segnaposto.

+0

Buon consiglio. Grazie. – dgel