6

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'@'%''の近くで使用する正しい構文を確認してください。 ")

%sforデータベース名の前後に一重引用符が追加されないようにするにはどうすればよいですか?Pythonで文字列置換を実行してこれを修正できることはわかっていますが、SQLインジェクションの脆弱性が発生する可能性があります。

4

1 に答える 1

6

プレースホルダーが機能しない場合があるため(ご存知のとおり)、文字列の連結を使用する必要があります。注意してください-文字列を検証し、期待する文字だけで構成されていることを確認してください(期待しない文字を探すだけではありません)。また、別の開発者にコードをチェックしてもらい、コメントを付けて、プレースホルダーを使用する必要があると他の人が考えていないことを確認します。

于 2012-04-09T17:30:40.020 に答える