我使用mysql.connector来执行一些简单的SQL语句。在这个例子中,我正在创建一个数据库模式。我想将数据库作为变量传递并在SQL中使用替换。
我认为以下是适当的技术来避免SQL注入。
当你试图替换数据库或表名时,似乎mysql.connector是有缺陷的,通常会在空格的情况下用这个mydb
的反引号包装。
如果我没有在%s周围添加反引号,那么它会因语法错误而失败。
如果我在%s
周围放置反引号,那么它会创建一个名称为“mydb'”的单引号的数据库。我只想把mydb作为名字。
我发现唯一可行的方法是使用标准python替换来创建整个SQL语句并将其传递给cursor.execute,但我认为这种技术不受欢迎。
我已经使用过mysqldb并且运行成功,但是我想使用mysql.connector。
可以用mysql.execute替换吗?
import mysql.connector
import sys
dbname = "mydb"
#========================
try:
db = mysql.connector.connect(host="localhost", user="alan", password="***")
except mysql.connector.Error as e:
raise SystemExit("MySQL Error %d at line %d: %s" % (e.errno, sys.exc_info()[2].tb_lineno, e.msg.decode("utf8")))
cursor = db.cursor()
try:
cursor.execute("""
CREATE DATABASE IF NOT EXISTS %s
""", (dbname,) )
except mysql.connector.Error as e:
raise SystemExit("MySQL Error %d at line %d: %s" % (e.errno, sys.exc_info()[2].tb_lineno, e.msg.decode("utf8")))
db.commit()
cursor.close()
db.close()