Kueri Berparameter
Cegah injeksi SQL
Kueri Berparameter adalah pelajaran Python Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Python Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Python Academy mencakup 4 pelajaran total.
Bahaya Merangkai Teks
Membangun SQL dengan merangkai teks berisiko. Jika masukan pengguna berisi SQL, masukan tersebut dapat mengubah kueri Anda. Ini disebut injeksi SQL.
Jangan pernah melakukan ini dengan data yang tidak tepercaya.
name = 'Alice'
# Unsafe pattern - do NOT do this
query = "SELECT * FROM users WHERE name = '" + name + "'"
print(query)Bentuk Injeksi
Bayangkan sebuah nilai berbahaya. Merangkainya akan mengubah makna kueri sepenuhnya.
name = "x' OR '1'='1"
query = "SELECT * FROM users WHERE name = '" + name + "'"
print(query)
print('The OR clause makes every row match!')Penanda Tempat sebagai Solusi
Cara yang aman adalah menggunakan kueri berparameter. Gunakan ? sebagai penanda tempat dan teruskan nilai sebagai tupel. Penggerak akan melakukan pelolosan dengan aman.
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)')
cur.execute('INSERT INTO users (name) VALUES (?)', ('Alice',))
cur.execute('SELECT * FROM users')
print(cur.fetchall())
conn.close()Beberapa Penanda Tempat
Gunakan satu ? untuk setiap nilai. Teruskan semuanya dalam tupel dengan urutan yang sama seperti kemunculannya.
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)')
cur.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('Bob', 25))
cur.execute('SELECT * FROM users')
print(cur.fetchall())
conn.close()Tupel Bernilai Tunggal
Tupel yang memiliki satu elemen memerlukan koma di akhir: ('Alice',). Tanpa koma tersebut, Python menganggap tanda kurung hanya sebagai pengelompokan.
good = ('Alice',)
bad = ('Alice')
print(type(good), type(bad))Upaya Injeksi Diblokir
Dengan penanda tempat, nilai berbahaya diperlakukan sebagai data biasa, bukan SQL. Nilai tersebut hanya tidak cocok dengan apa pun.
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)')
cur.execute('INSERT INTO users (name) VALUES (?)', ('Alice',))
evil = "x' OR '1'='1"
cur.execute('SELECT * FROM users WHERE name = ?', (evil,))
print('Rows matched:', cur.fetchall())
conn.close()Penanda Tempat Bernama
SQLite juga mendukung penanda tempat bernama dengan sintaks :name. Teruskan kamus yang berisi nilai.
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)')
cur.execute('INSERT INTO users (name, age) VALUES (:n, :a)', {'n': 'Carol', 'a': 40})
cur.execute('SELECT * FROM users')
print(cur.fetchall())
conn.close()Parameter dalam WHERE
Penanda tempat dapat digunakan dalam klausa apa pun yang menerima nilai, termasuk WHERE.
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)')
cur.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('Alice', 30))
cur.execute('INSERT INTO users (name, age) VALUES (?, ?)', ('Bob', 25))
cur.execute('SELECT name FROM users WHERE age > ?', (28,))
print(cur.fetchall())
conn.close()executemany
Untuk menyisipkan banyak baris, gunakan executemany() dengan daftar tupel. Cara ini lebih cepat dan tetap aman.
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)')
rows = [('Alice',), ('Bob',), ('Carol',)]
cur.executemany('INSERT INTO users (name) VALUES (?)', rows)
cur.execute('SELECT COUNT(*) FROM users')
print(cur.fetchone())
conn.close()Penanda Tempat Bukan untuk Pengenal
Penanda tempat hanya berfungsi untuk nilai, bukan nama tabel atau kolom. Nama tersebut harus berasal dari daftar putih tepercaya di kode Anda sendiri.
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)')
allowed = {'name', 'id'}
col = 'name'
if col in allowed:
cur.execute('SELECT ' + col + ' FROM users')
print('Safe column query ran')
conn.close()Fungsi Penyisipan yang Dapat Digunakan Kembali
Membungkus penyisipan berparameter dalam sebuah fungsi membuat kode Anda tetap rapi dan aman secara konsisten.
import sqlite3
conn = sqlite3.connect(':memory:')
cur = conn.cursor()
cur.execute('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)')
def add_user(cursor, name):
cursor.execute('INSERT INTO users (name) VALUES (?)', (name,))
add_user(cur, 'Dave')
cur.execute('SELECT * FROM users')
print(cur.fetchall())
conn.close()Pemeriksaan Cepat
Uji pengetahuan Anda tentang kueri yang aman.
Rangkuman
Anda telah mempelajari cara menulis kueri yang aman dari injeksi.
- Jangan pernah merangkai masukan yang tidak tepercaya ke dalam SQL
- Gunakan penanda tempat
?dengan tupel yang berisi nilai - Penanda tempat bernama
:namemenerima kamus executemany()menyisipkan banyak baris dengan aman- Penanda tempat digunakan untuk nilai, bukan pengenal
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Kueri Berparameter” gratis?
Ya — teks lengkap “Kueri Berparameter” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Python Academy, upgrade ke CoddyKit PRO. Kursus Python Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Kueri Berparameter”?
Cegah injeksi SQL Kamu berlatih Python Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Python Academy?
Tidak diperlukan pengalaman sebelumnya. Python Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Kueri Berparameter” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Python Academy ini?
Ya. Setiap pelajaran Python Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Menyambungkan dan Membuat Tabel
- Insert, Select, Update, Delete
- Kueri Berparameter
- Transaksi dan Pengelola Context