[解決済み] 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 のドライバに渡されるため (クエリテキスト内ではない)、インジェクションは行われないことに注意してください。文字列の中に好きな文字を残すことができ、文字を削除したり引用したりする必要はありません。
関連
-
[解決済み] Pythonのswitch文の代用品?
-
[解決済み] Pythonで型をチェックする標準的な方法は何ですか?
-
[解決済み] virtualenvで異なるバージョンのPythonを使用する
-
[解決済み] ブーリアン値を格納するために使用するMySQLデータ型
-
[解決済み] Pythonの "assert "はどのように使うのですか?
-
[解決済み] ローカルにインストールされたPythonモジュールの一覧を取得するにはどうしたらいいですか?
-
[解決済み] Pythonのdictsで'has_key()'と'in'のどちらを使うべきですか?
-
[解決済み] Pythonのマルチプロセッシングプールimap_unorderedの呼び出しの進捗を表示しますか?
-
[解決済み] Pythonでコード行間にかかる時間を測定するには?
-
[解決済み] Django 1.7で初期マイグレーションからマイグレートバックする方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] SQLクエリにパラメータとしてpythonのリストを指定する [重複].
-
[解決済み] Flaskで1時間ごとに関数を実行するようにスケジュールするには?
-
[解決済み] データフレームをソートした後にインデックスを更新する
-
[解決済み] DataFrameに日付間の日数カラムを追加する pandas
-
[解決済み] Django Rest Framework ファイルアップロード
-
[解決済み] Django 1.7で初期マイグレーションからマイグレートバックする方法は?
-
[解決済み] Flask でグローバル変数はスレッドセーフか?リクエスト間でデータを共有するには?
-
[解決済み] virtualenv の `--no-site-packages` オプションを元に戻す。
-
[解決済み] if 節の終了方法
-
[解決済み] データクラスとtyping.NamedTupleの主な使用例