Pracuję nad projektem, który wymaga programowego tworzenia użytkowników MySQL z aplikacji django. Mogę tworzyć użytkowników dobrze:Zapobieganie wstawianiu zapytań MySQL-Python wokół parametru nazwy bazy danych
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'))
To działa idealnie. Problem polega na tym, że próbuję nadać uprawnienia. Nazwa bazy danych jest również określana programowo:
cursor.execute("GRANT SELECT ON %s.* TO %[email protected]'%'", ('dbname', 'username'))
Skutkuje to błędem mysql bo gdy to robi podstawienie ciąg, umieszcza apostrofów wokół nazwy bazy danych, która jest składniowo niepoprawne:
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")
W jaki sposób zapobiec dodawaniu pojedynczych cudzysłowów wokół nazwy bazy danych dla nazwy %s
? Wiem, że mógłbym po prostu dokonać podstawiania ciągów w Pythonie i naprawić to, ale mogłoby to potencjalnie spowodować lukę SQL injection.
Wygląda na to, że może nie być to możliwe. Zgodnie z dokumentacją mysql-python: _Parametry zastępcze mogą być używane tylko do wstawiania wartości kolumn. Nie można ich używać do innych części SQL, takich jak nazwy tabel, wyciągi itp. – dgel