Lompat ke konten
Kembali ke modul

API, Autentikasi, dan Keamanan · 5/7

Authorization: siapa boleh melakukan apa

Authentication itu siapa kamu. Authorization itu apa yang boleh kamu sentuh — dan harus diperiksa di server, setiap kali.

Baca 28 menit

Setelah pelajaran ini kamu bisa

  • Membedakan authentication dari authorization
  • Memeriksa kepemilikan, bukan cuma identitas
  • Mengenali IDOR saat code review
  • Menjelaskan kenapa menyembunyikan tombol bukan pemeriksaan izin

Authentication itu *kamu siapa*. Authorization itu *kamu boleh menyentuh apa*. Keduanya pertanyaan berbeda, gagal dengan cara berbeda, dan mencampuradukkannya adalah bug serius paling umum di aplikasi web.

Authorization punya dua lapis, dan hanya memeriksa yang pertama itulah tempat masalahnya muncul.

  • Role — apakah seorang *lead* boleh melakukan ini sama sekali? Kasar, mudah, biasanya diingat.
  • Kepemilikan — apakah record *tertentu* ini miliknya? Halus, dan inilah yang sering terlupakan.

IDOR

IDOR — insecure direct object reference — adalah apa yang kamu dapat saat kamu memeriksa seseorang sudah masuk, lalu bertindak atas id apa pun yang mereka kirim. Ini tidak butuh alat: cukup ubah satu angka di URL.

Coba sendiri

Tiga handler, satu penyerang yang mengubah sebuah id. Hanya yang ketiga bertahan.

Hasil

Tekan Jalankan untuk melihat hasilnya.

Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.

Di mana pemeriksaannya harus berada

Taruh pemeriksaannya di tempat datanya disentuh. Apa pun yang lebih awal dari itu adalah optimasi yang bisa dilewati.

LapisanApakah ini kontrol keamanan?
Menyembunyikan tombolnya di UITidak. Cuma kosmetik.
Pemeriksaan di proxyTidak. Ia melewati /api, dan action dijangkau POST langsung.
Pemeriksaan di component halamanYa, untuk rendering halaman itu
Pemeriksaan di dalam Server ActionYa. Inilah yang sebenarnya.
Pemeriksaan di dalam Route HandlerYa.
Constraint di databaseYa — garis pertahanan terakhir
Coba sendiri

Matriks izin, cara menjaga aturan role tetap terbaca begitu jumlahnya lebih dari dua.

Hasil

Tekan Jalankan untuk melihat hasilnya.

Ini jalan di browser kamu, di dalam sandbox. Apa pun yang kamu tulis di sini tidak bisa merusak situs.

Tugas praktik

Di proyek ini, daftarkan dua akun. Yang pertama jadi lead. Masuk sebagai yang kedua (learner) lalu buka /id/dashboard — kamu seharusnya melihat progresmu sendiri tapi tanpa tabel tim. Sekarang temukan pemeriksaan di app/[lang]/dashboard/page.tsx yang memutuskan ini, dan pastikan ia terjadi di server alih-alih dengan menyembunyikan markup.

Hasil yang diharapkan

`listUsers()` tidak pernah dipanggil untuk learner, jadi datanya tidak pernah sampai ke browser.

Cek pemahaman

Sebuah action menerima (userId, bookingId) dan memeriksa booking-nya milik userId itu. Apakah itu pemeriksaan kepemilikan yang sah?

Pilih jawaban dulu