Materi
Sebagian query tidak bisa diparameterkan: nama tabel, nama kolom, dan arah urut ASC atau DESC. Cheat sheet SQL Injection Prevention OWASP menyebut validasi allowlist atau merancang ulang query sebagai pertahanan yang tepat untuk bagian itu, dan menyarankan nilai tersebut berasal dari kode, bukan dari parameter pengguna. Caranya: pengguna memilih sebuah kunci, misalnya "harga" atau "terbaru", lalu program mencari potongan SQL yang sudah ditulis programmer di sebuah kamus. Kunci yang tidak ada di kamus ditolak dengan ValueError. Arah urut dipetakan dengan cara yang sama.
Hasilnya, teks yang masuk ke query selalu salah satu dari beberapa string tetap di kode sumber; masukan pengguna hanya menentukan string mana yang dipilih. Menambahkan id sebagai kunci urut kedua membuat hasil tetap sama urutannya bila nilai kolom utama kembar.
KOLOM_URUT = {"judul": "judul", "terbit": "tahun_terbit"}
ARAH = {"naik": "ASC", "turun": "DESC"}
def daftar_buku(conn, urut, arah):
if urut not in KOLOM_URUT or arah not in ARAH:
raise ValueError("pilihan urut tidak dikenal")
sql = f"SELECT judul FROM buku ORDER BY {KOLOM_URUT[urut]} {ARAH[arah]}, id"
return [b[0] for b in conn.execute(sql)]