Materi
Setelah tipe benar, nilainya diperiksa terhadap aturan bisnis. Rentang ditulis dengan dua batas yang jelas, misalnya 1 <= jumlah <= 99. Nilai dari daftar pilihan, seperti jenis pengiriman, diperiksa dengan keanggotaan persis di sebuah set; OWASP menyebut keanggotaan persis berlaku juga untuk nilai yang dikirim dari menu tarik-turun, karena pengirim bisa mengirim nilai di luar menu. Satu jebakan Python: True dan False adalah int, sehingga isinstance(True, int) bernilai benar dan True lolos sebagai jumlah 1. Tolak bool secara terpisah.
Untuk teks berpola, OWASP meminta pola dicocokkan dengan seluruh nilai dan menyebut fullmatch di Python. re.match hanya menambatkan awal teks, sehingga 40115abc lolos pola lima digit. Menambahkan $ juga belum cukup: $ cocok tepat sebelum baris baru di akhir teks, sehingga "40115\n" lolos re.match(r"^[0-9]{5}$", ...). re.fullmatch menuntut pola menutup seluruh teks, tanpa pengecualian itu.
import re
LAYANAN = {"cuci", "setrika", "cuci-setrika"}
def validasi_laundry(data):
berat = data.get("berat_kg")
if isinstance(berat, bool) or not isinstance(berat, int) or not 1 <= berat <= 30:
raise ValueError("berat 1-30 kg")
if data.get("layanan") not in LAYANAN:
raise ValueError("layanan tidak dikenal")
if not re.fullmatch(r"[A-Z]{2}[0-9]{4}", data.get("kode", "")):
raise ValueError("kode nota salah")
return {"berat_kg": berat, "layanan": data["layanan"], "kode": data["kode"]}