0

私のコードは次のとおりです。

select_query = "SELECT DISTINCT name FROM people WHERE name in (%s)"
parameters = "'"+"','".join(['\\','--','where'])+"'"
cursor.execute(select_query, parameters)
print str(cursor._executed)

実行したいクエリは次のとおりです。

SELECT DISTINCT name FROM people WHERE name in ('\','--','where')

私は最後の手段としてこのパラメータにたどり着きました - それはまだ私が望むことを正確に行いません. Python は文字をエスケープし、出力は次を返します。

SELECT DISTINCT name FROM people WHERE name in ('\'\\\',\'--\',\'where\'')
4

2 に答える 2

0

生の文字列として入力することはできませんか?

rを文字列の前に置きます。

print "SELECT DISTINCT name FROM people WHERE name in ('\','--','where')"

SELECT DISTINCT name FROM people WHERE name in ('','--','where')

一方、次の場合r

print r"SELECT DISTINCT name FROM people WHERE name in ('\','--','where')"

SELECT DISTINCT name FROM people WHERE name in ('\','--','where')

于 2013-06-12T17:42:33.413 に答える
0

問題は、 yourがエスケープしようとするparameters文字を含む文字列であることです。MySQLdb

クエリ文字列を自分で補間することができます...

select_query = "SELECT DISTINCT name FROM people WHERE name in (%s)"
parameters = "'"+"','".join(['\\','--','where'])+"'"
cursor.execute(select_query % parameters)
print str(cursor._executed)

...しかし、それはSQLインジェクションに対して脆弱であり、あなたのケースでは機能しません.

SELECT DISTINCT name FROM people WHERE name in ('\','--','where')

...SO の構文の強調表示からわかるように、これは有効なクエリではありません。

このようなことをした方が安全です...

parameters = ['\\','--','where']
placeholders = ','.join(['%s'] * len(parameters))
select_query = "SELECT DISTINCT name FROM people WHERE name in (%s)" % placeholders
cursor.execute(select_query, parameters)
print str(cursor._executed)

...次のようなクエリが生成されます...

SELECT DISTINCT name FROM people WHERE name in ('\\','--','where')

...これはあなたが本当に望んでいるものだと思います。


アップデート

私は次のようなことをしたくないと思っていました: placeholders = ','.join(['%s'] * len(parameters)) これが私がここに投稿した理由です - より良い解決策はありませんか?

まあ、これが「より良い」かどうかはわかりませんが、MySQLdb固有のConnection.escape_string()メソッド、または基礎となる_mysqlモジュールのescape_string()関数を使用できます...

>>> import _mysql
>>> select_query = "SELECT DISTINCT name FROM people WHERE name in (%s)"
>>> parameters = "'"+"','".join(map(_mysql.escape_string, ['\\','--','where']))+"'"
>>> print select_query % parameters
SELECT DISTINCT name FROM people WHERE name in ('\\','--','where')

...しかし、 PEP249Connection.escape_string()では言及されていないため、クロス DB の互換性が失われます。

于 2013-06-12T18:05:01.787 に答える