web-dev-qa-db-ja.com

データベースクエリ文字列の引用符をエスケープする良い方法は?

私はあらゆる方法でPythonモジュールを試しましたが、それらは多すぎるか間違った方法でエスケープします。

31
Jonathan Prior

データベースクエリの一部である場合は、 パラメータ化されたSQLステートメント を使用できるはずです。

引用符をエスケープするだけでなく、これはすべての特殊文字を処理し、 SQLインジェクション攻撃 から保護します。

28
Dave Webb

使用する json.dumps

>>> import json
>>> print json.dumps('a"bc')
"a\"bc"
22
eddie_c

文字列をエスケープし、他のオブジェクトをプログラム形式に変換する簡単で標準的な方法は、repr()関数でビルドを使用することです。オブジェクトを、手動コードで入力する必要がある表現に変換します。

例えば。:

s = "I'm happy I am \"here\" now"
print repr(s)
>>  'I\'m happy I am "here" now'

奇妙なハックはありません。内蔵されており、ほとんどの目的で機能します。

9
GregD

古いスレッドに返信しますが、最良の方法はまだありません。

Psycopg2を使用している場合、execute -methodにはbuildinエスケープがあります。

cursor.execute("SELECT column FROM table WHERE column=%s AND column2=%s", (value1, value2))

Pythonの%演算子を使用して文字列を変更する代わりに、executeメソッドに2つの引数(stringとTuple)を指定していることに注意してください。

ここから盗まれた回答: psycopg2 mysqldb.escape_string?と同等

2
ex4

トリプルシングルクォートは、SQLクエリでよく使用されるシングルクォートを簡単にカプセル化します。

c.execute('''SELECT sval FROM sdat WHERE instime > NOW() - INTERVAL '1 days' ORDER BY instime ASC''')
2
Roy

文字列をエスケープするメソッドを持つpsycopg2を使用している場合:psycopg2.extensions.adapt()文字列値を引用する方法明示的に(Python DB API/Psycopg2) 完全な答え

2
EMP

エスケープするには、トリプルダブルクォートが最適です。

string = "" "これは、「単一引用符」、「二重引用符」、
、およびリテラルEOLにまたがり、すべて同じ文字列に含まれます。" ""
1
Miles

より一般的な問題の解決策として、タブ区切りのフラットファイルにany文字セットを保存する必要があるプログラムがあります。明らかに、「セット」にタブがあると問題が発生していました。

Output_f.write(str)の代わりに、output_f.write(repr(str))を使用して問題を解決しました。読み込むときに入力をeval()する必要があるため、読み込みが遅くなりますが、フリンジケースをチェックする必要がなくなるため、全体的にコードがクリーンになります。

0
robertlayton

ユースケースでは、データベースに対して段落を保存していましたが、段落内のどこかに、単一引用符(example: Charlie's Apple sauce was soggy)が付いたテキストがあった可能性があります

私はこれが最もうまくいくことがわかりました:

database_cursor.execute('''INSERT INTO books.collection (book_name, book_quoted_text) VALUES ('%s', "%s")''' % (book_name, page_text.strip()))

""でINSERTステートメントをラップした後、'''を使用していることに気付くでしょう。

0
dataviews