2012-04-09 63 views
6

我正在研究一个需要我以编程方式从django应用程序创建MySQL用户的项目。我可以创建用户就好了:防止MySQL-Python围绕数据库名称参数插入引号

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

完美地工作。问题是当我尝试授予权限时。数据库名称也编程方式确定:

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

这导致MySQL错误,因为当它的字符串替换,它把周围的数据库名称,这在语法上是不正确的单引号:

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

如何防止在%s的数据库名称周围添加单引号?我知道我可以简单地在Python中进行字符串替换并修复此问题,但这可能会导致SQL注入漏洞。

+1

看起来可能不可能。根据mysql-python文档:_Parameter占位符只能用于插入列值。它们不能用于SQL的其他部分,例如表名,语句等.​​_ – dgel 2012-04-09 17:26:57

回答

6

有时占位符将无法工作(因为你已经发现),所以你将不得不使用字符串连接。小心 - 验证字符串,确保它只包含您期望的字符(不要只查找不期望的字符),并且您应该没问题。还请另一位开发人员检查您的代码,并对其进行评论以确保没有人认为您应该使用占位符。

+0

很好的建议。谢谢。 – dgel 2012-04-09 21:38:03