SQLクエリに文字列補間を使用する場合は注意してください。文字列補間では入力パラメータが正しくエスケープされず、アプリケーションがSQLインジェクションの脆弱性にさらされる可能性があります。 違いは些細なことのように思えるかもしれませんが、実際には大きな違いです 。
不正解(セキュリティの問題あり)
c.execute("SELECT * FROM foo WHERE bar = %s AND baz = %s" % (param1, param2))
正解(エスケープあり)
c.execute("SELECT * FROM foo WHERE bar = %s AND baz = %s", (param1, param2))
これは、SQLステートメントのパラメーターをバインドするために使用される修飾子が異なるDB API実装間で異なり、mysqlクライアントライブラリがprintf
を使用するという混乱を助長します。 より一般的に受け入れられている「?」の代わりにスタイル構文マーカー(例:python-sqlite
。