djangoアプリからMySQLユーザーをプログラムで作成する必要があるプロジェクトに取り組んでいます。私はユーザーをうまく作成することができます:
from django.db import connection, transaction
cursor = connection.cursor()
cursor.execute("CREATE USER %s@'%'", 'username')
cursor.execute("SET PASSWORD FOR %s@'%' = PASSWORD(%s)", ('username', 'pass'))
それは完璧に機能します。問題は、権限を付与しようとしたときです。データベース名もプログラムで決定されます。
cursor.execute("GRANT SELECT ON %s.* TO %s@'%'", ('dbname', 'username'))
これにより、mysqlエラーが発生します。これは、文字列置換を行うときに、データベース名を一重引用符で囲むため、構文的に正しくありません。
DatabaseError:(1064、 "SQL構文にエラーがあります。MySQLサーバーのバージョンに対応するマニュアルで、1行目の'' dbname'。*から'username'@'%''の近くで使用する正しい構文を確認してください。 ")
%s
forデータベース名の前後に一重引用符が追加されないようにするにはどうすればよいですか?Pythonで文字列置換を実行してこれを修正できることはわかっていますが、SQLインジェクションの脆弱性が発生する可能性があります。