Ok jadi saya tidak begitu berpengalaman dengan Python.
Saya memiliki kode Python berikut:
cursor.execute("INSERT INTO table VALUES var1, var2, var3,")
Dimana var1
adalah integer, var2
& var3
adalah string.
Bagaimana saya bisa menulis nama variabel tanpa python memasukkannya sebagai bagian dari teks kueri?
%
. Nyatanya, saya katakan demikian dalam jawabannya.%
alih-,
alih antara string dan variabel .. tidak dapat membatalkan suara saya karena berbagai alasan .. Saya pribadi ingin melihat kata-kata seperti tidak aman / serangan dll disebutkan dalam deskripsi di mana Anda mengatakan jangan tidak digunakan%
..%
operator untuk memformat string. Mereka yang ada%
dalam string digunakancursor.execute
secara langsung, dan karena ia tahu itu menghasilkan SQL, ia dapat berbuat lebih banyak untuk melindungi Anda.Implementasi berbeda dari Python DB-API diizinkan untuk menggunakan placeholder yang berbeda, jadi Anda harus mencari tahu mana yang Anda gunakan - bisa juga (misalnya dengan MySQLdb):
cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", (var1, var2, var3))
atau (misalnya dengan sqlite3 dari pustaka standar Python):
cursor.execute("INSERT INTO table VALUES (?, ?, ?)", (var1, var2, var3))
atau yang lain (setelah
VALUES
Anda bisa memiliki(:1, :2, :3)
, atau "gaya bernama"(:fee, :fie, :fo)
atau di(%(fee)s, %(fie)s, %(fo)s)
mana Anda meneruskan dict alih-alih peta sebagai argumen kedua keexecute
). Periksaparamstyle
konstanta string dalam modul DB API yang Anda gunakan, dan cari paramstyle di http://www.python.org/dev/peps/pep-0249/ untuk melihat apa saja gaya parameter-passing itu!sumber
Banyak jalan. JANGAN gunakan yang paling jelas (
%s
dengan%
) dalam kode nyata, itu terbuka untuk serangan .Di sini salin-tempel dari pydoc dari sqlite3 :
# Never do this -- insecure! symbol = 'RHAT' c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol) # Do this instead t = ('RHAT',) c.execute('SELECT * FROM stocks WHERE symbol=?', t) print c.fetchone() # Larger example that inserts many records at a time purchases = [('2006-03-28', 'BUY', 'IBM', 1000, 45.00), ('2006-04-05', 'BUY', 'MSFT', 1000, 72.00), ('2006-04-06', 'SELL', 'IBM', 500, 53.00), ] c.executemany('INSERT INTO stocks VALUES (?,?,?,?,?)', purchases)
Lebih banyak contoh jika Anda membutuhkan:
# Multiple values single statement/execution c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', ('RHAT', 'MSO')) print c.fetchall() c.execute('SELECT * FROM stocks WHERE symbol IN (?, ?)', ('RHAT', 'MSO')) print c.fetchall() # This also works, though ones above are better as a habit as it's inline with syntax of executemany().. but your choice. c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', 'RHAT', 'MSO') print c.fetchall() # Insert a single item c.execute('INSERT INTO stocks VALUES (?,?,?,?,?)', ('2006-03-28', 'BUY', 'IBM', 1000, 45.00))
sumber
http://www.amk.ca/python/writing/DB-API.html
Berhati-hatilah saat Anda menambahkan nilai variabel ke pernyataan Anda: Bayangkan pengguna menamai dirinya sendiri
';DROP TABLE Users;'
- Itulah mengapa Anda perlu menggunakan sql escaping, yang disediakan Python untuk Anda saat Anda menggunakan cursor.execute dengan cara yang layak. Contoh di url adalah:cursor.execute("insert into Attendees values (?, ?, ?)", (name, seminar, paid) )
sumber