我正在编写一个小的 python 脚本来帮助我为我的个人项目自动创建 mysql 数据库和相关帐户。这个脚本的一部分是一个函数,它将数据库名称作为一个字符串,然后去创建数据库。
def createDB(dbConn, dbName):
import MySQLdb
c = dbConn.cursor()
query = """CREATE DATABASE %s;""";
c.execute(query, (dbName,))
这不起作用,因为 MySQL's CREATE DATABASE询问数据库的不带引号的名称,如
CREATE DATAbASE test_db
但是我的代码试图安全地将用户提供的数据库名称插入到查询中创建:
CREATE DATABASE 'test_db'
然后你得到“你的 MySQL 语法接近测试时有问题”。
尽管这是供个人使用,但我真的不想直接将用户提供的字符串插入任何类型的查询中。这违背了我的宗教信仰。有没有一种安全的方法可以将用户提供的数据库名称插入到 python(或任何语言)的 mySQL 查询中,以确保用户输入如 test_db; DROP some_other_db;
会被拒绝或正确转义吗?
最佳答案
数据库名称(也不是列名或表名)不是数据值,因此不适合使用占位符。想要这样做通常是一个不好的迹象;只有 DBA 应该能够发出 create database
,因为这样做需要一些相当大的权限。大多数应用程序需要 DBA 发出创建数据库,然后将创建的数据库作为参数用于 dbapi.Connection 的参数。
如果你确定你需要这个,你信任输入的来源,并且你已经检查了输入的无效字符,你只需在 python 中进行替换,比如:
def createDB(dbConn, dbName):
c = dbConn.cursor()
query = """CREATE DATABASE %s;""" % dbName
c.execute(query)
关于python - 有什么安全的方法可以在 MySQL 查询中参数化数据库名称吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6656636/