11

SQL インジェクションからエスケープされるように、クエリ パラメータを名前付き辞書としてcursor.execute()メソッドに渡したいと考えています。MySQLdb

なぜこれが得られるのか説明できますかKeyError

>>> c.execute('select id from users where username=%(user)s', {'user':'bob',})
KeyError: 'user'

MySQLdb マニュアルhttp://mysql-python.sourceforge.net/MySQLdb.htmlは次のように述べています。

パラメータスタイル

インターフェイスが期待するパラメーター マーカーの書式設定のタイプを示す文字列定数。'format'= ANSI C printf フォーマット コードに設定します'...WHERE name=%s'。にマッピング オブジェクトが使用されている場合conn.execute()、インターフェイスは実際に'pyformat'= Python 拡張フォーマット コードを使用します'...WHERE name=%(name)s'。ただし、API は現在、paramstyle で複数のスタイルを指定することを許可していません。

4

2 に答える 2

15

MySQLdbでは、ディクショナリをクエリ パラメータとして使用できます。この応答は、それを行うさまざまな方法をすべて示しています。「実行」するための2番目のパラメーターとして、そのようなパラメーター(タプル、辞書...)としてシーケンスを提供するだけで済みます。クエリを「実行」メソッドの 1 つのパラメーターとしてフォーマットしないでください。そうしないと、SQL インジェクション攻撃にさらされる可能性があります。見る:

"SELECT * FROM users WHERE username = '%s'" % (user)

userが次のような文字列に等しいとどうなるか考えてみてください:

peter';DROP TABLE users;SELECT * from users where ''='

もう 1 つの方法は、MySQLdb ライブラリが必要なチェックを処理できるため、安全です。

あなたのクエリは私にとってはうまくいくので、何が悪いのかわかりません:

# Connect to db
# Open a cursor
stmt = "SELECT * FROM users WHERE username = %(user)s"
cursor.execute(stmt, {"user": "bob"})
user = cursor.fetchone()
print user

{'username': 'bob', 'alias': 'bobby', 'avatar': 'default', 'fullname': 'bob'}

詳しい情報を教えてください。

于 2013-05-29T15:02:18.943 に答える
3

貼り付けた後のドキュメントの行は、あなたの質問に答えるかもしれません:

パラメーター プレースホルダーは、列の値を挿入するためにのみ使用できます。テーブル名、ステートメントなど、SQL の他の部分には使用できません。

于 2012-10-11T03:00:00.730 に答える