2012-04-09 14 views
6

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.

+1

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

Odpowiedz

6

Czasami symbole zastępcze nie będą działać (jak się dowiedziałeś), więc będziesz musiał użyć konkatenacji ciągów. Bądź ostrożny - sprawdź ciąg znaków, upewnij się, że składa się tylko z oczekiwanych znaków (nie szukaj tylko znaków, których się nie spodziewasz) i powinieneś być w porządku. Poproś także innego programistę, by sprawdził kod i skomentuj go, aby upewnić się, że nikt inny nie myśli, że powinieneś używać symboli zastępczych.

+0

Dobra rada. Dzięki. – dgel

Powiązane problemy