Materi
Balai pelatihan kerja di Bekasi membuka pendaftaran kelas desain grafis, akuntansi, dan las listrik lewat formulir web. Data yang masuk dipakai di tiga tempat: disimpan ke basis data, ditampilkan di tabel admin, dan dihitung untuk kuota kelas. Formulir lama hanya memeriksa isian di peramban, menyimpan dengan f-string, dan menampilkan nama apa adanya di tabel admin.
Ketiga lapisan di misi ini punya tugas berbeda dan tidak saling menggantikan. Validasi menolak data yang melanggar kontrak: nama 2–60 karakter, umur 15–65 dari angka 0–9, kelas dari daftar tetap. Query berparameter menjaga perintah SQL, termasuk untuk data sah yang memuat tanda petik. Escaping keluaran menjaga halaman admin saat nama yang sah memuat karakter seperti < atau &.
# Urutan yang sama di formulir lain: validasi → simpan berparameter → escape saat tampil
bersih = validasi_tamu(data)
conn.execute("INSERT INTO tamu(nama, instansi) VALUES (?, ?)", (bersih["nama"], bersih["instansi"]))
baris = f"<li>{html.escape(bersih['nama'])}</li>"