Materi
Validasi memastikan masukan memenuhi kontrak sebelum dipakai: tipenya benar, bentuknya benar, panjangnya dalam batas. OWASP menekankan bahwa validasi tidak menggantikan query berparameter atau escaping keluaran; ketiganya bekerja bersama. Validasi menangkap data yang salah lebih awal dan memberi pesan yang jelas, sedangkan parameter tetap menjaga query dari data yang lolos validasi.
Fungsi int() lebih longgar daripada yang dikira. Ia menerima spasi di awal dan akhir, garis bawah pemisah ribuan seperti 1_000, tanda plus, dan digit Unicode apa pun, termasuk angka lebar penuh 12 dan angka Arab-Indik ١٢. str.isdigit() bahkan menerima pangkat dua ², yang justru ditolak int(). Kalau kontraknya "angka 0–9 ASCII", tulis kontrak itu persis: re.fullmatch(r"[0-9]{1,3}", teks), baru kemudian int(). Pola \d tanpa flag re.ASCII juga cocok dengan semua digit Unicode.
import re
def baca_lantai(teks):
if not isinstance(teks, str) or not re.fullmatch(r"[0-9]{1,2}", teks):
raise ValueError("lantai harus 1-2 digit angka 0-9")
return int(teks)
int("12"), int(" 12 "), int("1_000") # (12, 12, 1000) — semuanya lolos int()
"²".isdigit() # True, padahal int("²") gagal