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.
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