python - 有什么安全的方法可以在 MySQL 查询中参数化数据库名称吗?

标签 python mysql mysql-python prepared-statement

我正在编写一个小的 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/

相关文章:

php - 在for循环中使用MySQL从数据库中获取数据

python - 尝试将列表导入 mysql 表时出错

python - 如何将数据存储在数据库中以标识在服务器上启动的进程

python - bash : 'command not found' for python, r 和 nano

php - 从不存在值的表中选择

python - 我可以将项目附加到我在 Python 中循环的列表吗?

php - 如何使用 PHP 检查 SQL 数据库是否已有

python - 使用 SQLAlchemy 将 pandas 数据帧导出到 MySQL 时出现操作错误 2055

python - 有没有办法捕获列表理解中的未命中?

regex - Python字符串匹配