我想撰寫一個 python 腳本來創建新的 MariaDB 資料庫。
資料庫名稱是用戶輸入。我嘗試使用引數來創建資料庫:
#!/usr/bin/python3
import mysql.connector
mariadb_host = '127.0.0.1'
mariadb_port = 3306
mariadb_user = 'root'
mariadb_password = 'password'
mariadb_connection = mysql.connector.connect(
host=mariadb_host,
port=mariadb_port,
user=mariadb_user,
passwd=mariadb_password,
use_pure=True
)
query = 'CREATE DATABASE %(db_name)s;'
args = {'db_name': 'test-db'}
result = None
cursor = mariadb_connection.cursor()
cursor.execute(query, args)
print(cursor.statement)
result = cursor.fetchall()
cursor.close()
出現以下錯誤:mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''test-db'' at line 1
看來,該命令cursor.execute附加'在資料庫名稱周圍,這會導致無效的 sql 查詢。
我怎樣才能解決這個問題并根據用戶輸入安全地創建新資料庫?
uj5u.com熱心網友回復:
引數替換符號 -%(name)s或者只是%s用于將值插入到 SQL 陳述句中。
RDBMS 對值和識別符號(如資料庫、表或列名稱)有不同的參考規則。例如,一個字串值會被單引號包圍來告訴 RDBMS 這是一個字符值,但是單引號一個識別符號是一個語法錯誤;RDBMS 將要求使用其他字符(例如反引號、雙引號、方括號,具體取決于 RDBMS)來參考識別符號。
如果要 使用 Python插入識別符號,則必須使用字串格式化技術。例如,使用 f 字串
db_name = 'test-db'
query = f'CREATE DATABASE `{db_name}`;'
請注意,最好用反引號參考動態識別符號名稱來處理包含特殊字符的名稱。
與動態 SQL 生成一樣,在處理來自不受信任來源的資料時,您應該意識到 SQL 注入的風險。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/394807.html
