Dou*_* T. 2 python mysql mysql-python sql-parametrized-query
我正在写一个小的python脚本来帮助我自动创建我的个人项目的mysql数据库和相关帐户.此脚本的一部分是将数据库名称作为字符串,然后创建数据库的函数.
def createDB(dbConn, dbName):
import MySQLdb
c = dbConn.cursor()
query = """CREATE DATABASE %s;""";
c.execute(query, (dbName,))
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为MySQL的CREATE DATABASE请求数据库的不带引号的名称,如
CREATE DATAbASE test_db
Run Code Online (Sandbox Code Playgroud)
但我的代码尝试安全地将用户提供的数据库名称插入查询中,创建:
CREATE DATABASE 'test_db'
Run Code Online (Sandbox Code Playgroud)
并且你得到"你的MySQL语法接近测试时遇到问题".
即使这是供个人使用,我真的不想直接将用户提供的字符串插入任何类型的查询中.它反对我的宗教.有没有一种安全的方法可以将用户提供的数据库名称插入到python(或任何语言)的mySQL查询中,以确保用户输入test_db; DROP some_other_db;会被拒绝或正确转义?
数据库名称(也不是列或表名称)不是数据值,因此不适合使用占位符.想要做到这一点通常是一个不好的迹象; 只有DBA应该能够发出一个create database,因为这样做需要一些相当大的特权.大多数应用程序要求DBA发出create database,然后将创建的数据库作为参数用于dbapi.Connection的参数.
如果你确定需要这个,你相信输入的来源,你已经检查了无效字符的输入,你只需要在python中进行替换,例如:
def createDB(dbConn, dbName):
c = dbConn.cursor()
query = """CREATE DATABASE %s;""" % dbName
c.execute(query)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
849 次 |
| 最近记录: |