Skip to content

Ketika Server Fail-Closed, Antarmuka Pun Harus Jujur

Adityo Guni Waluyo

Server menolak unggahan bebas dari editor ter-scope, tetapi tombolnya tetap ditawarkan. Gate antarmuka menertibkan affordance; penegakan tetap di server.

Ringkasan

Jadi gini, editor yang cuma punya akses terbatas masih bisa lihat tombol upload media, padahal pasti kena 403 karena server emang cuma izinin admin-global. Server-nya sih udah aman fail-closed, masalahnya di UI, jadi tombolnya disembunyiin pakai gerbang canManageModule, niru pola canUploadFree. Intinya UI cuma cerminan aturan server, bukan penegak keamanan beneran.

Saat editor dengan cakupan terbatas di sistem KotaPortal membuka pemilih media dan mencoba mengunggah berkas tanpa memilih entitas terkait, sistem selalu menampilkan pesan galat 403. Tombol unggah tersebut tetap terlihat jelas di antarmuka pengguna, menjanjikan sebuah tindakan yang sebenarnya akan selalu ditolak oleh peladen. Proses unggah yang persis sama berhasil dilakukan tanpa hambatan ketika menggunakan akun admin-global. Kontras ini menimbulkan kebingungan nyata: antarmuka memberi ilusi kemampuan yang tidak dimiliki akun tersebut.

Asumsi awal yang sering muncul dalam pengembangan perangkat lunak adalah menyembunyikan tombol tersebut sudah cukup untuk menegakkan aturan keamanan. Pengembang mungkin berpikir bahwa jika pengguna tidak dapat melihat tombol, mereka tidak dapat melakukan tindakan yang dilarang. Namun, menyembunyikan elemen antarmuka hanyalah langkah higienis, bukan mekanisme penegakan yang sesungguhnya. Faktanya, sisi peladen sudah lama fail-closed: unggahan bebas hanya diterima dari admin-global [1]. Antarmuka pengguna lah yang memberikan sinyal keliru kepada pengguna akhir, menciptakan ekspektasi yang tidak dapat dipenuhi oleh sistem.

Prinsip Dasar Kontrol Akses

Kontrol akses hanya efektif jika berada di kode sisi peladen yang tepercaya, tempat penyerang tidak dapat mengubah pemeriksaan akses atau metadata [1]. Kecuali untuk sumber daya yang memang bersifat publik, sistem harus menolak permintaan secara default [1]. Prinsip penolakan default ini memastikan bahwa setiap permintaan yang tidak memiliki izin eksplisit akan ditolak, mengurangi permukaan serangan secara berarti. Dokumentasi keamanan standar industri juga menekankan bahwa metadata dan pemeriksaan akses tidak boleh dapat dimodifikasi oleh entitas yang tidak tepercaya [1]. Gerbang di sisi antarmuka hanya berfungsi sebagai cerminan aturan peladen, bukan pengganti dari titik penegakan hukum yang sebenarnya.

Langkah Perbaikan Antarmuka

Perbaikan arsitektur dilakukan dengan menempatkan gerbang pada tombol unggah, kolom input, dan penangan acara di balik fungsi canManageModule(bidang, ""). Pola implementasi ini secara langsung meniru aturan peladen dan mengikuti pola canUploadFree yang sudah mapan pada tampilan media. Langkah penerapan kondisional ini memanfaatkan sintaks pemrograman untuk merender elemen secara bersyarat [9]. Menempatkan predikat gerbang di dekat aturan yang dicerminkannya juga soal pemeliharaan: ketika aturan server berubah, pembedaan di antarmuka tinggal satu diff kecil. Uji pada rbac.test.ts mematok semantika modul kosong, sehingga pergeseran perilaku terdeteksi sebelum sampai ke produksi. Jika kondisi akses tidak terpenuhi, komponen mengembalikan nilai null agar tidak merender apa pun [9]. State pada kerangka kerja ini bertindak sebagai memori komponen yang secara dinamis menentukan elemen apa yang tampil di layar pengguna [10]. Ketika hak akses berubah, pembaruan state memicu render ulang yang menghilangkan elemen terlarang secara otomatis, dan gerbang pada penangan acara menghemat satu round trip yang pasti gagal: permintaan tidak pernah dikirim.

Pelajaran dari Status Kosong

Menampilkan pesan galat 403 sebagai satu-satunya respons terhadap upaya upload bebas admin global yang dilarang merupakan cacat affordance yang harus dihindari. Cacat affordance terjadi ketika desain menyarankan tindakan yang tidak dapat dilakukan. Empty state ikut dijaga: teks panduannya tidak lagi menyarankan tombol yang tidak akan pernah muncul bagi editor ter-scope. Dengan menghilangkan tombol secara kondisional, antarmuka memberikan umpan balik yang jujur tentang kemampuan yang tersedia bagi peran pengguna tersebut.

Pemilihan pustaka media tetap dibiarkan terbuka karena daftar media bersifat read-open antar bidang, memastikan akses baca tidak terhambat oleh pembatasan akses tulis. Pengujian otomatis memainkan peran vital dalam mempertahankan integritas logika ini. Semantika predikat modul kosong sering kali bergeser seiring penambahan fitur baru. Logika validasi ini dipatok secara eksplisit dalam berkas pengujian otomatis rbac.test.ts. Pengujian ini memastikan bahwa setiap perubahan kode di masa depan tidak akan secara tidak sengaja mengembalikan tombol unggah untuk pengguna yang tidak memiliki hak akses yang sesuai.

Aturan server tidak berubah sama sekali dalam perbaikan ini; yang berubah hanya antarmuka yang kini jujur. Keputusan untuk menyelaraskan antarmuka dengan aturan peladen menghilangkan kebingungan pengguna secara permanen. Sistem tidak lagi menawarkan pilihan yang tidak dapat dieksekusi, dan integritas keamanan tetap terjaga di titik penegakan yang sebenarnya.

Sumber

[1] Broken_Access_Control/index.html — OWASP Top 10:2021 A01 Broken Access Control

[9] rendering — React Docs: Conditional Rendering

[10] a-components-memory — React Docs: State - A Component's Memory

Artikel terkait