Materi
Aplikasi web menerima permintaan dari peramban, aplikasi seluler, atau skrip siapa saja. Seluruh isi permintaan itu — kolom formulir, parameter di URL, kolom tersembunyi, cookie, header, dan badan JSON — berada di tangan pengirimnya. Batas kepercayaan adalah garis antara data yang dikendalikan pihak luar dan data yang dibuat atau disimpan server sendiri. Semua yang melintasi garis itu diperlakukan sebagai klaim, bukan fakta, sampai server memeriksanya.
Dua aturan turun dari sini. Pertama, nilai yang bisa dihitung atau dicari server sendiri tidak diambil dari permintaan: harga dibaca dari katalog, total disusun di server. Kedua, identitas pengguna datang dari sesi yang dibuat saat ia masuk, bukan dari kolom user_id di formulir. Kolom tersembunyi tetap bisa diubah pengirimnya, dan OWASP mencatat validasi JavaScript di peramban bisa dilewati, sehingga server memeriksa ulang semuanya.
MENU = {"NG01": 18000, "ES02": 6000} # harga resmi kantin, milik server
def total_pesanan(permintaan):
total = 0
for baris in permintaan["baris"]:
if baris["kode"] not in MENU:
raise ValueError("menu tidak dikenal")
total += MENU[baris["kode"]] * baris["jumlah"] # bukan baris["harga"]
return total