1. ホーム
  2. python

[解決済み] Python MySQLDB IN句で使用するためのリストのインプロード

2022-11-10 18:45:35

質問

リストを文字列にマッピングする方法は知っています。

foostring = ",".join( map(str, list_of_ids) )

そして、その文字列をIN句に入れるには、次のようにすればいいことが分かっています。

cursor.execute("DELETE FROM foo.bar WHERE baz IN ('%s')" % (foostring))

MySQLDB を使用して、同じことを安全に(SQL インジェクションを避けて)実行する必要があります。上記の例では、foostring が実行する引数として渡されないため、脆弱性があります。また、mysql ライブラリの外部で引用とエスケープを行う必要があります。

(そこには 関連するSOの質問 がありますが、そこに記載されている回答は MySQLDB では動作しないか、SQL インジェクションに対する脆弱性があります)。

どのように解決するのですか?

を使用します。 list_of_ids を直接使用します。

format_strings = ','.join(['%s'] * len(list_of_ids))
cursor.execute("DELETE FROM foo.bar WHERE baz IN (%s)" % format_strings,
                tuple(list_of_ids))

そうすることで、自分自身を引用する必要がなくなり、あらゆる種類のSQLインジェクションを避けることができます。

なお、データ( list_of_ids ) はパラメータとして直接 mysql のドライバに渡されるため (クエリテキスト内ではない)、インジェクションは行われないことに注意してください。文字列の中に好きな文字を残すことができ、文字を削除したり引用したりする必要はありません。