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

Posted

技术标签:

【中文标题】防止 MySQL-Python 在数据库名称参数周围插入引号【英文标题】:Prevent MySQL-Python from inserting quotes around database name parameter 【发布时间】:2012-04-22 01:15:42 【问题描述】:

我正在开展一个项目,该项目需要我从 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 服务器版本相对应的手册,了解在 ''dbname' 附近使用的正确语法。* to 'username'@'%''在第 1 行")

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

【问题讨论】:

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

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

【讨论】:

以上是关于防止 MySQL-Python 在数据库名称参数周围插入引号的主要内容,如果未能解决你的问题,请参考以下文章

第1月3周4天

hibernate防止sql注入对参数赋值传参数的例子

关于MySQL的1064错误

MySQL参数化有效防止SQL注入

Linux第一周学习笔记(13)

pandas通过DatetimeProperties对象获取日期对象在所在周的周几星期几的名称信息(week name)并生成新的数据列计算不同星期名称下其它数据列的均值