Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
防止MySQL Python在数据库名称参数周围插入引号_Python_Mysql_Django_Mysql Python - Fatal编程技术网

防止MySQL Python在数据库名称参数周围插入引号

防止MySQL Python在数据库名称参数周围插入引号,python,mysql,django,mysql-python,Python,Mysql,Django,Mysql Python,我正在从事一个项目,该项目要求我从django应用程序以编程方式创建MySQL用户。我可以很好地创建用户: from django.db import connection, transaction cursor = connection.cursor() cursor.execute("CREATE USER %s@'%'", 'username') cursor.execute("SET PASSWORD FOR %s@'%' = PASSWORD(%s)", ('username', 'p

我正在从事一个项目,该项目要求我从django应用程序以编程方式创建MySQL用户。我可以很好地创建用户:

from django.db import connection, transaction
cursor = connection.cursor()
cursor.execute("CREATE USER %s@'%'", 'username')
cursor.execute("SET PASSWORD FOR %s@'%' = PASSWORD(%s)", ('username', 'pass'))
那很好用。问题是当我尝试授予权限时。数据库名称也是通过编程方式确定的:

cursor.execute("GRANT SELECT ON %s.* TO %s@'%'", ('dbname', 'username'))
这会导致mysql错误,因为当它进行字符串替换时,会在数据库名称周围加上单引号,这在语法上是不正确的:

DatabaseError:(1064,“您的SQL语法有错误;请查看与您的MySQL服务器版本对应的手册,以了解在第1行“dbname.”*至“username”@“%”附近使用的正确语法)


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

有时占位符不起作用(如您所发现的),因此您必须使用字符串连接。小心-验证字符串,确保它只由您期望的字符组成(不要只查找您不期望的字符),您应该可以。另外,请另一名开发人员检查您的代码,并对其进行注释,以确保没有其他人认为您应该使用占位符。

看起来这是不可能的。根据mysql-python文档:参数占位符只能用于插入列值。它们不能用于SQL的其他部分,如表名、语句等。