MySQLdb
Python とDB APIの両方が%s
置換を示すために使用していることは、混乱を招く可能性があります。DB API では、主に SQL インジェクション攻撃を回避するために使用されます。ステートメントでは、文字列の置換が必要な場合にcursor.execute()
のみ使用する意味があります。%s
例えば。
次の sql を実行します。
CREATE TABLE foo (myfield INTEGER);
いいえ
CREATE TABLE 'foo' ('myfield' INTEGER);
次のようなものが適している可能性があります。
field1_name_and_type = 'myfield VARCHAR(100)'
sql="create table %s (%s)" % (tablename, field1_name_and_type)
cur.execute(sql)
INSERT
次に、テーブルに入れたい場合%s
は、execute ステートメントで を使用して文字列をエスケープします。
my_malicious_sql = input()
cur.execute('INSERT INTO %s VALUES (%%s)' % tablename, my_malicious_sql)
この例では、 の最初の引数は次のexecute()
ように展開されtablename == "foo"
ます。
cur.execute('INSERT INTO foo VALUES (%s)', my_malicious_sql)
次に、MySQLdb ライブラリはmy_malicious_sql
、SQL インジェクション エラーを回避するために文字列を正しくエスケープし、テキストをデータベース テーブルに挿入します。