Materi
Query rakitan dibuat dengan menyambung teks, misalnya f-string yang menyisipkan nama dari formulir di antara tanda petik. Hasil sambungan itu sampai ke SQLite sebagai satu teks perintah, dan SQLite tidak tahu bagian mana yang ditulis programmer dan bagian mana yang diketik pengguna. Nama sah seperti Ahmad Na'im sudah cukup merusaknya: tanda petik di tengah nama menutup literal teks lebih awal, dan SQLite melempar OperationalError. Masukan yang disusun dengan sengaja bisa mengubah arti perintahnya. OWASP merumuskan sumber masalahnya: kueri dinamis yang dirakit lewat penyambungan string dari masukan pengguna.
Query berparameter memisahkan keduanya. Teks SQL ditulis lengkap dengan tanda tanya sebagai penanda tempat (placeholder), lalu nilainya dikirim terpisah sebagai argumen kedua execute(), berupa tuple. Basis data menerima perintah yang sudah jadi dan memperlakukan setiap nilai sebagai data, apa pun isinya: nama bertanda petik dicari persis seperti ditulis. OWASP menempatkan cara ini sebagai pertahanan pertama, dan dokumentasi sqlite3 menegaskan placeholder dipakai untuk mengikat nilai, bukan format string Python.
judul = "Ronggeng Dukuh Paruk" # dari kotak pencarian perpustakaan
# Rakitan: nilai menyatu dengan teks SQL
conn.execute(f"SELECT id FROM buku WHERE judul = '{judul}'")
# Berparameter: teks SQL tetap, nilai dikirim terpisah
conn.execute("SELECT id FROM buku WHERE judul = ?", (judul,))