Web Application Security Fundamentals #07: Input Validation
Pelajari allowlist, schema validation, canonicalization, server-side validation, dan perbedaannya dari sanitization serta output encoding.
Input Validation memastikan data memenuhi bentuk dan aturan yang diharapkan sebelum diproses. Ia penting, tetapi bukan obat untuk semua vulnerability dan tidak menggantikan parameterization maupun output encoding.
Etika dan scope: praktikkan hanya pada local lab, aplikasi milik sendiri, atau sistem yang memberikan izin tertulis. Tutorial ini tidak mengizinkan pengujian terhadap target publik.

Tujuan pembelajaran
- memvalidasi type, length, range, format, dan business rule
- memahami allowlist serta canonicalization
- membedakan validation, sanitization, dan encoding
- menerapkan validation di server
Prasyarat
Gunakan browser modern, Developer Tools, dan local lab. Catat versi tool serta environment ketika menguji. Output contoh bersifat ilustratif kecuali dinyatakan sebagai hasil pengujian; jangan menganggap perilaku satu stack berlaku universal.
1. Tentukan schema
Mulai dari contract. Field umur semestinya integer dalam range, bukan string bebas. Status sebaiknya enum. Identifier memiliki format dan panjang yang jelas.
const OrderSchema = z.object({
productId: z.string().uuid(),
quantity: z.number().int().min(1).max(20)
}).strict();
Contoh memakai Zod 3.x. .strict() menolak key tak dikenal; cek dokumentasi versi sebelum mengadopsi.
2. Validasi server-side
Client-side validation bagus untuk UX, tetapi dapat dilewati. Server harus memvalidasi ulang setiap input termasuk header, cookie, webhook, file metadata, dan data dari service lain.
3. Pilih allowlist
Jika domain input terbatas, definisikan nilai yang diterima. Blacklist pola berbahaya mudah dilewati dengan encoding, variasi syntax, atau context berbeda. Namun regex kompleks juga dapat menimbulkan performance issue; batasi panjang sebelum regex.
4. Canonicalization
Normalisasi hanya jika business rule membutuhkannya dan lakukan konsisten sebelum comparison. Unicode, path, hostname, dan case memiliki aturan berbeda. Jangan membuat normalisasi buatan sendiri untuk security-critical identifier.
5. Business validation
Schema benar belum berarti transaksi sah. Quantity 10 mungkin valid secara type tetapi melanggar stok atau limit pengguna. Jalankan invariant pada server dan gunakan transaction/concurrency control yang sesuai.
6. Validation bukan sanitization
Validation menerima atau menolak input berdasarkan contract. Sanitization mengubah data. Output encoding melindungi context output. Parameterization memisahkan data dari query. Gunakan control sesuai sink.
7. Error response
Kembalikan pesan yang membantu tanpa stack trace, query, secret, atau detail internal. Simpan correlation ID untuk troubleshooting.
{
"error": "invalid_request",
"fields": {"quantity": "must be between 1 and 20"},
"correlationId": "req_example"
}
8. Negative test
Uji missing field, extra field, wrong type, boundary, oversized input, malformed encoding, duplicate value, dan concurrency. Property-based testing atau fuzzing dapat membantu pada local lab, tetapi hasil harus ditinjau.
Kesalahan umum
- Hanya memvalidasi form browser.
- Menggunakan blacklist karakter.
- Menghapus karakter diam-diam hingga arti data berubah.
- Menganggap validation mencegah seluruh XSS/SQL injection.
- Tidak membatasi ukuran request.
Quality gate sebelum diterapkan
- [ ] Scope dan asset sudah jelas.
- [ ] Control dijalankan di sisi yang menjadi security boundary.
- [ ] Positive test dan negative test tersedia.
- [ ] Error tidak membocorkan secret atau detail internal.
- [ ] Logging cukup untuk detection tanpa merekam credential.
- [ ] Versi dependency dan dokumentasi dicatat.
- [ ] Tidak ada klaim “100% aman”.
- [ ] Perubahan diuji pada staging atau local lab.
Kesimpulan
Input yang valid masih perlu identity dan session yang benar. Tutorial berikutnya membahas Authentication dan Session Management.
Referensi resmi
- OWASP Top 10:2025 — diakses 22 Agustus 2026.
- OWASP Cheat Sheet Series — diakses 22 Agustus 2026.
- OWASP Web Security Testing Guide — Stable — diakses 22 Agustus 2026.
- MDN Web Security — diakses 22 Agustus 2026.
Post Terkait
Web Application Security Fundamentals #06: Secure SDLC
Masukkan threat modeling, secure design, code review, testing, deployment, monitoring, dan incident learning ke seluruh...
Web Application Security Fundamentals #05: Common Web Attack Vectors
Kenali jalur serangan umum seperti input, identity, session, upload, dependency, dan business logic tanpa menguji target...
Web Application Security Fundamentals #04: Mengenal OWASP Top 10:2025
Mengenal kategori OWASP Top 10:2025, perubahan dari 2021, batas penggunaannya, serta cara mengubahnya menjadi backlog en...