2012-04-09 15 views
6

Estoy trabajando en un proyecto que me requiere crear usuarios de MySQL mediante programación desde una aplicación django. Puedo crear a los usuarios muy bien:Evite que MySQL-Python inserte comillas alrededor del parámetro de nombre de base de datos

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')) 

Eso funciona perfectamente. El problema es cuando trato de otorgar permisos. El nombre de base de datos también se determina mediante programación:

cursor.execute("GRANT SELECT ON %s.* TO %[email protected]'%'", ('dbname', 'username')) 

Esto da lugar a un error de MySQL, porque cuando lo hace la sustitución de cadenas, coloca comillas simples alrededor del nombre de la base de datos, que es sintácticamente incorrecto:

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")

¿Cómo evito que se agreguen comillas simples alrededor del %s para el nombre de la base de datos? Sé que simplemente podría hacer la sustitución de cadenas en Python y arreglar esto, pero eso podría causar una vulnerabilidad de inyección SQL.

+1

Parece que no es posible. De acuerdo con los documentos de mysql-python: _ Los marcadores de posición de parámetros solo se pueden usar para insertar valores de columna. No se pueden usar para otras partes de SQL, como nombres de tablas, declaraciones, etc._ – dgel

Respuesta

6

A veces los marcadores de posición no funcionarán (como ha descubierto), por lo que deberá usar la concatenación de cadenas. Tenga cuidado: valide la cadena, asegúrese de que solo esté compuesta por los caracteres que espera (no solo busque los caracteres que no espera), y debería estar bien. También solicite a otro desarrollador que verifique su código y coméntelo para asegurarse de que nadie más piense que debe usar marcadores de posición.

+0

Buen consejo. Gracias. – dgel

Cuestiones relacionadas