Lompat ke konten utama

Kompetisi Ajak Teman: hadiah total Rp1.000.000 tunai untuk 3 pengajak terbanyak. Berakhir 29 November 2026. Ikut kompetisi

←

Pemrograman Web Aman: Input, Query, dan Hak Akses

Pelajaran 7 dari 14

Query berparameter

Misi: modul laporan stok gudang

Setelah pelajaran ini kamu bisa memperbaiki modul laporan dan pencatatan stok yang menggabungkan LIKE, IN, ORDER BY, placeholder bernama, dan executemany.

±17 menitDiperiksa 7 Okt 2026

Materi

Distributor bahan pangan di Makassar, Surabaya, dan Jakarta memakai aplikasi gudang buatan sendiri. Halaman laporan stoknya punya kotak pencarian, pilihan gudang yang bisa dicentang lebih dari satu, dan pilihan urut. Halaman impornya mencatat mutasi barang dan memperbarui harga dari berkas unggahan. Semua query di kedua halaman itu dirakit dengan f-string, dan tim ingin memperbaikinya tanpa mengubah tampilan.

Untuk setiap bagian query, tentukan dulu jenisnya. Nilai, termasuk pola LIKE dan isi daftar IN, dikirim lewat parameter. Bagian struktur, yaitu nama kolom dan arah urut, dipilih dari kamus allowlist. Pola LIKE di-escape supaya % dan _ dibaca apa adanya. Perubahan banyak baris memakai executemany dengan placeholder bernama, sehingga kamus dari berkas bisa dikirim langsung.

# Kerangka yang sama di tabel lain: daftar karyawan per cabang
tanda = ", ".join("?" * len(cabang))
sql = f"SELECT nama FROM karyawan WHERE cabang IN ({tanda}) ORDER BY {URUT[urut]}, id"
conn.execute(sql, list(cabang))

Latihan

0/4 lulus

Misi akhir modul: luluskan minimal 4 dari 4 tugas. Jawaban diperiksa di server. Lulus berarti kamu memahami contohnya, bukan penilaian seluruh pekerjaanmu.

Latihan 3 dari 4

Saat meninjau perbaikan, kamu membaca empat baris di bawah (URUT adalah kamus allowlist di kode). Baris mana yang masih rentan injeksi?

sql_1 = "SELECT nama FROM barang WHERE nama LIKE ? ESCAPE '\\'"
sql_2 = f"SELECT nama FROM barang ORDER BY {URUT[urut]}, id"
sql_3 = f"SELECT nama FROM barang WHERE gudang = '{gudang}'"
sql_4 = f"SELECT nama FROM barang WHERE id IN ({', '.join('?' * len(ids))})"
Pilih satu jawaban

Catatanmu

Memuat catatan…

tersimpan otomatis, ikut tercetak · 0/4.000

Luluskan semua latihan dulu untuk menandai pelajaran ini selesai.

Lanjutkan ke