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 6 dari 14

Query berparameter

ORDER BY dan nama kolom lewat allowlist

Setelah pelajaran ini kamu bisa mengizinkan pengguna memilih kolom urut, arah urut, atau kolom saring dengan memetakan pilihannya ke potongan SQL tetap.

±13 menitDiperiksa 7 Okt 2026

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)]

Latihan

0/3 lulus

Jawaban diperiksa di server. Lulus berarti kamu memahami contohnya, bukan penilaian seluruh pekerjaanmu.

Latihan 3 dari 3

Pengembang menulis kode di bawah supaya pengguna bisa mengurutkan produk menurut kolom pilihannya, lalu menjalankannya dengan urut = "harga". Apa hasilnya?

conn.execute("SELECT nama FROM produk ORDER BY ?", (urut,)).fetchall()
Pilih satu jawaban

Catatanmu

Memuat catatan…

tersimpan otomatis, ikut tercetak · 0/4.000

Luluskan semua latihan dulu untuk menandai pelajaran ini selesai.

Lanjutkan ke