Pemindaian virus untuk unggahan berkas: opsi arsitektur untuk aplikasi
Pemindaian virus untuk unggahan berkas dijelaskan untuk aplikasi yang banyak dokumen: penyimpanan karantina, antrean pemindaian, kontrol akses, retry, dan alur rilis aman.

Masalah dengan kata-kata sederhana: berkas tidak aman masuk ke aplikasi Anda
Jika aplikasi Anda memungkinkan orang mengunggah dokumen, Anda menerima berkas yang bukan Anda buat. Pada produk yang banyak berkas (portal pelanggan, sistem HR, aplikasi klaim, onboarding vendor), unggahan sering terjadi, dan pengguna sering berbagi berkas dari email, drive bersama, atau pihak ketiga. Itu membuat aplikasi ini jadi target praktis: satu unggahan yang sukses bisa menyebar ke banyak unduhan.
Risikonya bukan hanya “virus.” Berkas Word atau Excel bisa membawa makro berbahaya, PDF bisa dibuat untuk mengeksploitasi bug pembaca, dan sebuah “invoice” bisa berupa dokumen phishing yang menipu seseorang untuk menelepon nomor palsu atau memasukkan kredensial. Beberapa berkas diracuni dengan cara yang lebih tersembunyi, seperti menyembunyikan payload di dalam ZIP, memakai ekstensi ganda (report.pdf.exe), atau menyematkan konten jarak jauh yang mengirim sinyal saat dibuka.
Bergantung pada antivirus sederhana yang diinstal di satu server tidak cukup. Unggahan mungkin mengenai beberapa instance aplikasi, berpindah antar sistem penyimpanan, atau disajikan dari object storage atau CDN. Jika jalur kode mana pun secara tidak sengaja mengekspos unggahan mentah, pengguna bisa mengunduhnya sebelum pemindaian selesai. Pembaruan, salah konfigurasi, dan akses admin “sementara” juga bisa melewati pemindaian seiring waktu.
Tujuan jelas untuk pemindaian virus pada unggahan berkas sederhana: tidak ada berkas yang belum dipindai yang boleh diunduh atau dilihat oleh siapa pun yang tidak secara eksplisit diizinkan meninjau konten yang dikarantina.
Tentukan apa arti “aman” sebagai aturan bisnis, bukan sekadar perasaan. Misalnya:
- Harus lulus pemindaian malware dengan set tanda tangan yang up-to-date
- Harus cocok dengan tipe berkas dan batas ukuran yang diizinkan
- Harus disimpan dan disajikan hanya dari lokasi yang disetujui
- Harus memiliki jejak audit: siapa yang mengunggah, kapan, dan status akhir
- Harus diblokir sampai ada keputusan final: rilis atau tolak
Jika Anda membangun dengan platform seperti AppMaster, perlakukan “status pemindaian” sebagai field kelas-satu dalam model data Anda dan pastikan setiap aksi unduhan memeriksanya. Satu gerbang itu mencegah banyak kesalahan mahal.
Apa arti karantina sebenarnya untuk dokumen yang diunggah
“Karantina” paling baik dipahami sebagai sebuah status di sistem Anda, bukan sekadar folder di penyimpanan. Ide intinya sederhana: berkas ada, tetapi tidak ada yang bisa membuka atau mengunduhnya sampai aplikasi Anda memiliki hasil pemindaian yang jelas dan tercatat. Ini adalah inti dari pemindaian virus untuk unggahan berkas.
Karantina biasanya bekerja sebagai siklus kecil dengan status yang jelas. Menjaga state eksplisit membuatnya lebih sulit untuk secara tidak sengaja membocorkan konten yang tidak aman melalui pratinjau, URL langsung, atau pekerjaan ekspor.
Set status berkas yang praktis terlihat seperti ini:
- received (unggahan selesai, belum dipindai)
- scanning (diambil oleh worker)
- clean (aman untuk dirilis)
- rejected (ditemukan malware atau pelanggaran kebijakan)
- failed (kesalahan scanner, timeout, atau berkas rusak)
Karantina juga membutuhkan metadata yang tepat agar Anda bisa menegakkan akses dan mengaudit apa yang terjadi nanti. Setidaknya, simpan: pemilik (pengguna atau organisasi), status, nama berkas asli dan tipe, checksum (untuk dedupe dan pemeriksaan perubahan), lokasi penyimpanan, dan cap waktu (uploaded, scan started, scan finished). Banyak tim juga menyimpan versi scanner dan detail verdict pemindaian.
Retensi adalah keputusan kebijakan, tapi harus dilakukan dengan sengaja. Simpan berkas karantina hanya selama Anda perlu memindainya dan men-debug kegagalan. Retensi yang pendek mengurangi risiko dan biaya, tetapi Anda tetap ingin cukup waktu untuk menyelidiki insiden dan membantu pengguna yang bertanya “ke mana unggahan saya?”
Akhirnya, putuskan apa yang dilakukan pada berkas yang tidak pernah selesai dipindai. Tetapkan waktu maksimum pemindaian dan cap “kedaluwarsa”. Ketika batas waktu lewat, pindahkan berkas ke failed, blokir akses, dan baik coba ulang secara otomatis sejumlah terbatas atau hapus dan minta pengguna untuk mengunggah ulang.
Pola penyimpanan sementara yang mengurangi risiko
Penyimpanan sementara adalah tempat sebagian besar masalah unggahan terjadi. Berkas ada di sistem Anda, tetapi Anda belum tahu apakah aman, jadi Anda butuh tempat yang mudah dikunci dan sulit terekspos secara tidak sengaja.
Disk lokal bisa berfungsi untuk satu server, tetapi rapuh. Jika Anda men-scale ke banyak server aplikasi, Anda harus berbagi penyimpanan, menyalin berkas, dan mempertahankan permission yang konsisten. Object storage (seperti bucket bergaya S3 atau container cloud) sering lebih aman untuk aplikasi yang banyak dokumen karena aturan akses terpusat dan log lebih jelas.
Pola sederhana untuk pemindaian virus pada unggahan berkas adalah memisahkan penyimpanan “karantina” dari penyimpanan “bersih”. Anda bisa melakukan ini dengan dua bucket/container, yang membuat kesalahan lebih kecil kemungkinannya, atau dengan struktur prefix ketat di dalam satu bucket, yang bisa lebih murah dan mudah dikelola.
Jika Anda menggunakan prefix, buatlah tidak mungkin untuk bingung. Pilih tata letak seperti quarantine/<tenant_id>/<upload_id> dan clean/<tenant_id>/<document_id>, bukan nama yang diberikan pengguna. Jangan pernah menggunakan kembali path yang sama untuk status berbeda.
Ingat aturan ini:
- Jangan izinkan pembacaan publik pada karantina, bahkan “sementara.”
- Hasilkan nama objek dari sisi server, bukan nama klien.
- Partisi berdasarkan tenant atau akun untuk mengurangi blast radius.
- Simpan metadata (pemilik, status, checksum) di database Anda, bukan di nama file.
Enkripsi saat istirahat, dan tegas tentang siapa yang dapat mendekripsi. API unggah hanya boleh menulis ke karantina, scanner hanya boleh membaca dari karantina dan menulis ke yang bersih, dan aplikasi publik hanya boleh membaca dari yang bersih. Jika cloud Anda mendukung kebijakan kunci, kaitkan hak dekripsi ke set peran sekecil mungkin.
Berkas besar memerlukan perhatian ekstra. Untuk multi-part upload, jangan tandai objek “siap” sampai bagian terakhir dikomit dan Anda sudah mencatat ukuran dan checksum yang diharapkan. Pendekatan aman umum adalah mengunggah bagian ke karantina, lalu menyalin atau mempromosikan objek ke yang bersih hanya setelah pemindaian lulus.
Contoh: Di portal pelanggan yang dibangun dengan AppMaster, Anda bisa memperlakukan setiap unggahan sebagai “pending”, menyimpannya di bucket karantina, dan hanya menampilkan tombol unduh setelah hasil pemindaian mengubah status menjadi “clean”.
Opsi arsitektur: pemindaian inline vs pemindaian latar belakang
Saat menambahkan pemindaian virus untuk unggahan berkas, biasanya Anda memilih antara dua alur: memindai inline (pengguna menunggu) atau memindai di latar (aplikasi menerima unggahan tetapi memblokir akses sampai dibersihkan). Pilihan yang tepat bergantung kurang pada “tingkat keamanan” (keduanya bisa aman) dan lebih pada kecepatan, keandalan, dan seberapa sering orang mengunggah berkas.
Opsi 1: Pemindaian inline (pengguna menunggu)
Pemindaian inline berarti permintaan unggah tidak selesai sampai scanner mengembalikan hasil. Ini terasa sederhana karena hanya ada satu langkah: unggah, pindai, terima atau tolak.
Pemindaian inline biasanya dapat diterima ketika berkas kecil, unggahan jarang, dan Anda bisa menjaga waktu tunggu tetap dapat diprediksi. Misalnya, alat tim di mana pengguna mengunggah beberapa PDF per hari mungkin mentolerir jeda 3 sampai 10 detik. Kekurangannya adalah pemindaian yang lambat membuat aplikasi menjadi lambat. Timeout, retries, dan jaringan seluler dapat mengubah file bersih menjadi pengalaman pengguna yang buruk.
Opsi 2: Pemindaian latar (asinkron)
Pemindaian asinkron menyimpan berkas terlebih dahulu, menandainya sebagai “karantina”, dan memasukkan pekerjaan ke antrean pemindaian. Pengguna mendapat respons “unggahan diterima” yang cepat, tetapi tidak dapat mengunduh atau melihat pratinjau berkas sampai dibersihkan.
Pendekatan ini lebih baik untuk volume tinggi, berkas besar, dan jam sibuk karena memecah beban kerja dan menjaga aplikasi responsif. Ini juga memungkinkan Anda men-scale worker pemindaian secara terpisah dari server web atau API utama.
Hybrid yang praktis adalah: jalankan pemeriksaan cepat inline (daftar putih tipe file, batas ukuran, validasi format dasar), lalu lakukan pemindaian antivirus penuh di latar. Ini menangkap masalah jelas lebih awal tanpa membuat setiap pengguna menunggu.
Berikut cara sederhana memilih:
- Berkas kecil, volume rendah, alur kerja yang butuh hasil segera: pemindaian inline
- Berkas besar, banyak unggahan, atau waktu pemindaian tidak dapat diprediksi: pemindaian latar
- SLA ketat untuk respons unggah: pemindaian latar + UI status yang jelas
- Beban kerja campuran: hybrid (pemeriksaan cepat dulu, pemindaian penuh asinkron)
Jika Anda membangun dengan AppMaster, pilihan ini sering terpetakan ke endpoint API sinkron (inline) atau Business Process yang mengantri pekerjaan pemindaian dan memperbarui status berkas saat hasil tiba.
Langkah demi langkah: membangun antrean pemindaian asinkron
Pemindaian asinkron berarti Anda menerima unggahan, menguncinya di karantina, dan memindainya di latar. Pengguna tidak mendapatkan akses sampai scanner menyatakan aman. Ini biasanya arsitektur pemindaian malware paling praktis untuk aplikasi yang banyak dokumen.
1) Definisikan pesan antrean (jaga agar kecil)
Perlakukan antrean sebagai daftar tugas. Setiap unggahan membuat satu pesan yang menunjuk ke berkas, bukan berkas itu sendiri.
Pesan sederhana biasanya berisi:
- File ID (atau object key) dan tenant atau project ID
- Uploaded-by user ID
- Timestamp unggahan dan checksum (opsional tapi membantu)
- Nomor percobaan (atau counter retry terpisah)
Hindari meletakkan byte mentah di antrean. Payload besar bisa melampaui batas, menambah biaya, dan meningkatkan eksposur.
2) Bangun alur worker (fetch, scan, record)
Worker menarik pesan, mengambil berkas dari penyimpanan karantina, memindainya, lalu menulis keputusan kembali.
Alur yang jelas adalah:
- Ambil berkas berdasarkan ID dari penyimpanan karantina (bucket privat atau volume privat)
- Jalankan scanner (engine AV atau layanan pemindaian)
- Tulis hasil ke database Anda: status (clean, infected, error), nama/versi scanner, dan cap waktu
- Jika clean: pindahkan berkas ke penyimpanan yang disetujui atau ubah flag akses sehingga dapat diunduh
- Jika terinfeksi: tetap ke karantina (atau hapus) dan beri tahu pihak yang tepat
3) Buat idempoten (aman untuk diproses ulang)
Worker akan crash, pesan terkirim dua kali, dan retry akan terjadi. Rancang agar memindai berkas yang sama dua kali tidak merusak. Gunakan sumber kebenaran tunggal seperti files.status dan hanya izinkan transisi valid, misalnya: uploaded -> scanning -> clean/infected/error. Jika worker melihat clean, ia harus berhenti dan mengakui pesan.
4) Kontrol concurrency (hindari gelombang pemindaian)
Tetapkan batas per worker dan per tenant. Batasi berapa banyak pemindaian yang bisa berjalan bersamaan, dan pertimbangkan antrean terpisah untuk berkas besar. Ini mencegah satu pelanggan sibuk menghabiskan seluruh kapasitas scanner.
5) Tangani kegagalan dengan retry dan jejak audit
Gunakan retry untuk kesalahan sementara (timeout scanner, masalah jaringan) dengan jumlah percobaan maksimum kecil. Setelah itu, kirim pesan ke dead-letter queue untuk peninjauan manual.
Simpan jejak audit: siapa yang mengunggah dokumen, kapan masuk karantina, scanner mana yang dijalankan, apa keputusannya, dan siapa yang menyetujui atau menghapus berkas. Log itu sama pentingnya dengan pemindaian virus untuk unggahan berkas, terutama untuk portal pelanggan dan kepatuhan.
Kontrol akses: menjaga berkas karantina benar-benar privat
Karantina bukan sekadar status di database Anda. Itu adalah janji bahwa tidak ada yang bisa membuka berkas sampai terbukti aman. Aturan paling aman sederhana: jangan pernah menyajikan berkas karantina melalui URL publik, bahkan yang “sementara.”
Alur unduh yang baik itu membosankan dan ketat. Aplikasi harus memperlakukan setiap unduhan seperti aksi terlindungi, bukan seperti mengambil gambar.
- Minta unduhan
- Periksa izin pengguna terhadap berkas spesifik itu
- Periksa status berkas (karantina, clean, rejected)
- Kirim berkas hanya jika status clean
Jika Anda menggunakan signed URL, pegang ide yang sama: buat hanya setelah pemeriksaan izin dan status, dan buat masa berlakunya singkat. Expirasi pendek mengurangi kerusakan jika tautan bocor melalui log, screenshot, atau email yang diteruskan.
Akses berbasis peran membantu Anda menghindari logika “kasus khusus” yang berubah jadi celah. Peran tipikal untuk aplikasi yang banyak dokumen adalah:
- Uploader: dapat melihat unggah mereka sendiri dan status pemindaian
- Reviewer: dapat melihat berkas bersih, dan kadang melihat karantina hanya di alat tinjau yang aman
- Admin: dapat menyelidiki, memindai ulang, dan menimpa akses bila perlu
- Pengguna eksternal: hanya bisa mengakses dokumen yang dibagikan secara eksplisit
Juga lindungi dari tebak ID. Jangan gunakan ID berurutan seperti 12345. Gunakan ID yang opak, dan selalu authorize per pengguna dan per berkas (bukan hanya “siapapun yang login”). Bahkan jika bucket penyimpanan Anda privat, endpoint API yang ceroboh masih bisa membocorkan konten karantina.
Saat membangun pemindaian virus untuk unggahan berkas, lapisan akses adalah tempat sebagian besar kegagalan dunia nyata terjadi. Di platform seperti AppMaster, Anda akan menegakkan pemeriksaan ini di endpoint API dan logika bisnis sebelum menghasilkan respons unduhan apa pun, sehingga karantina tetap privat secara default.
Merilis, menolak, dan mencoba ulang: menangani hasil pemindaian
Setelah berkas selesai dipindai, hal terpenting adalah memindahkannya ke satu status yang jelas dan membuat langkah berikutnya dapat diprediksi. Jika Anda membangun pemindaian virus untuk unggahan berkas, perlakukan hasil pemindaian seperti gerbang: tidak ada yang menjadi dapat diunduh sampai gerbang mengizinkan.
Hasil sederhana menutup sebagian besar sistem nyata:
- Clean: rilis berkas dari karantina dan izinkan akses normal.
- Infected: blokir akses secara permanen dan jalankan alur kerja berkas terinfeksi.
- Unsupported: scanner tidak dapat menilai tipe ini (atau berkas dilindungi kata sandi). Tetap blokir.
- Scan error: kegagalan sementara (timeout, layanan tidak tersedia). Tetap blokir.
Pesan ke pengguna harus jelas dan tenang. Hindari kata-kata menakutkan seperti “Akun Anda telah dikompromikan.” Pendekatan yang lebih baik: “Berkas sedang diperiksa. Anda bisa melanjutkan pekerjaan.” Jika berkas diblokir, jelaskan langkah selanjutnya: “Unggah tipe berkas lain” atau “Coba lagi nanti.” Untuk berkas yang tidak didukung, beri keterangan spesifik (misalnya, “Arsip terenkripsi tidak dapat dipindai”).
Untuk berkas terinfeksi, putuskan sejak awal apakah akan menghapus atau menyimpannya. Menghapus lebih sederhana dan mengurangi risiko. Menyimpan dapat membantu audit, tetapi hanya jika Anda menyimpannya di area terisolasi dengan akses ketat dan periode retensi singkat, dan Anda mencatat siapa yang bisa melihatnya (idealnya, tidak ada kecuali admin keamanan).
Retry berguna, tetapi hanya untuk kesalahan yang kemungkinan bersifat sementara. Tetapkan kebijakan retry kecil agar Anda tidak membangun backlog tanpa akhir:
- Retry pada timeout dan downtime scanner.
- Jangan retry pada “infected” atau “unsupported.”
- Batasi retry (misalnya, 3) lalu tandai sebagai failed.
- Tambahkan backoff antar percobaan untuk menghindari overload.
Akhirnya, perlakukan kegagalan berulang sebagai masalah ops, bukan masalah pengguna. Jika banyak berkas masuk “scan error” dalam waktu singkat, beri tahu tim Anda dan jeda rilis baru. Di AppMaster, Anda bisa memodelkan status ini di database dan merutekan notifikasi melalui modul messaging bawaan sehingga orang yang tepat cepat tahu tentang kegagalan.
Skenario contoh: portal pelanggan dengan banyak dokumen
Portal pelanggan membiarkan klien mengunggah faktur dan kontrak untuk setiap proyek. Ini tempat umum di mana pemindaian virus untuk unggahan berkas penting, karena pengguna akan menyeret apa pun yang ada di desktop mereka, termasuk berkas yang diteruskan dari orang lain.
Saat pelanggan mengunggah PDF, portal menyimpannya ke lokasi sementara privat dan membuat record database dengan status diset ke Pending scan. Berkas belum ditampilkan sebagai dapat diunduh. Worker pemindaian menarik berkas dari antrean, menjalankan pemindaian, lalu memperbarui record menjadi Clean atau Blocked.
Di UI, pelanggan melihat dokumen muncul segera, tetapi dengan badge Pending yang jelas. Nama berkas dan ukuran terlihat sehingga mereka tahu unggahan berhasil, tetapi tombol Download dinonaktifkan sampai pemindaian selesai. Jika pemindaian memakan waktu lebih lama dari perkiraan, portal bisa menampilkan pesan sederhana seperti “Kami sedang memeriksa berkas ini untuk keamanan. Coba lagi dalam satu menit.”
Jika scanner menandai dokumen, pelanggan melihat Blocked dengan catatan singkat non-teknis: “Berkas ini gagal pemeriksaan keamanan.” Dukungan dan admin mendapat tampilan terpisah yang mencakup alasan pemindaian dan tindakan berikutnya. Mereka bisa:
- tetap memblokir dan meminta unggahan baru
- menghapusnya dan mencatat alasannya
- menandainya sebagai false positive hanya jika kebijakan mengizinkan
Saat ada sengketa (“Saya mengunggah kemarin dan Anda kehilangannya”), log yang baik sangat penting. Simpan cap waktu untuk upload received, scan started, scan finished, status changed, dan siapa yang melakukan apa. Juga simpan hash file, nama berkas asli, akun pengunggah, alamat IP, dan kode hasil scanner. Jika Anda membangun ini di AppMaster, Data Designer ditambah Business Process flow sederhana dapat mengelola status dan field audit tanpa mengekspos berkas karantina ke pengguna biasa.
Kesalahan umum yang menyebabkan celah keamanan nyata
Sebagian besar kegagalan keamanan unggahan bukanlah serangan canggih. Mereka adalah pilihan desain kecil yang secara tidak sengaja membuat berkas tidak aman berperilaku seperti dokumen normal.
Satu masalah klasik adalah race: aplikasi menerima unggahan, mengembalikan URL unduhan, dan pengguna (atau layanan lain) dapat mengambil berkas sebelum pemindaian selesai. Jika Anda melakukan pemindaian virus untuk unggahan berkas, perlakukan “unggah” dan “tersedia” sebagai dua status yang berbeda.
Berikut kesalahan yang sering muncul:
- Mencampur berkas bersih dan karantina di bucket/folder yang sama, lalu mengandalkan aturan penamaan. Satu permission atau tebakan path yang salah membuat karantina tidak berarti.
- Memercayai ekstensi file, MIME type, atau pemeriksaan sisi klien. Penyerang bisa mengganti nama apa pun ke .pdf dan UI Anda akan cuek.
- Tidak merencanakan downtime scanner. Jika scanner lambat atau offline, berkas bisa berlama-lama di “pending”, dan tim mulai menambah override manual yang tidak aman.
- Membiarkan worker latar melewatkan aturan otorisasi yang sama seperti API utama. Worker yang bisa membaca “semua file” adalah eskalasi hak yang sunyi.
- Mempublikasikan ID yang mudah ditebak (seperti nomor berurutan) untuk item karantina, bahkan jika Anda pikir kontennya terlindungi.
Pengujian juga sering menjadi celah. Tim menguji dengan beberapa berkas kecil dan bersih lalu menganggap selesai. Anda juga perlu mencoba unggahan besar, berkas rusak, dan dokumen yang dilindungi kata sandi, karena di situlah scanner dan parser sering gagal atau timeout.
Contoh nyata sederhana: pengguna portal mengunggah “contract.pdf” yang sebenarnya executable yang diganti nama di dalam arsip. Jika portal Anda menyajikannya kembali secara instan, atau tim dukungan dapat mengakses karantina tanpa pemeriksaan yang tepat, Anda telah membuat jalur pengiriman langsung ke pengguna lain.
Daftar periksa cepat sebelum Anda rilis
Sebelum Anda rilis pemindaian virus untuk unggahan berkas, lakukan satu pemeriksaan akhir pada tempat-tempat di mana tim biasanya berasumsi “aman” padahal nanti diketahui tidak.
Tujuannya sederhana: berkas tidak aman tidak boleh menjadi dapat dibaca hanya karena seseorang menebak URL, mencoba ulang permintaan, atau menggunakan link cache lama.
Mulailah dari alur pengguna. Setiap aksi download, preview, atau “buka berkas” harus memeriksa status pemindaian berkas saat itu juga, bukan hanya saat unggah. Ini melindungi Anda dari kondisi race (seseorang klik segera), hasil pemindaian tertunda, dan kasus tepi di mana berkas dipindai ulang.
Gunakan daftar periksa pra-rilis ini sebagai baseline minimal:
- Penyimpanan karantina bersifat privat secara default: tidak ada akses bucket publik, tidak ada “siapa pun dengan tautan”, dan tidak ada penyajian langsung dari object storage mentah.
- Setiap record berkas memiliki pemilik (pengguna, tim, atau tenant) plus state lifecycle jelas seperti pending, clean, infected, atau failed.
- Antrean pemindaian dan worker memiliki retry terbatas, aturan backoff, dan alert saat item macet atau sering gagal.
- Ada audit log untuk unggahan, hasil pemindaian, dan upaya unduhan (termasuk yang diblokir), dengan siapa, kapan, dan kenapa.
- Override manual ada untuk kasus langka, tetapi hanya admin, tercatat, dan dibatasi waktunya (tidak ada tombol “mark clean” diam-diam).
Akhirnya, pastikan Anda bisa mengobservasi sistem secara end-to-end. Anda harus bisa menjawab: “Berapa banyak berkas yang saat ini menunggu pemindaian?” dan “Tenant mana yang mengalami kegagalan?” Jika Anda membangun di AppMaster, modelkan siklus hidup berkas di Data Designer dan tegakkan pengecekan status di Business Process Editor agar aturan tetap konsisten di web dan mobile.
Langkah selanjutnya: mengubah desain menjadi aplikasi yang berjalan
Mulailah dengan menuliskan state pasti yang mungkin dimiliki berkas Anda, dan apa yang diizinkan setiap state. Buat sederhana dan eksplisit: “uploaded”, “queued”, “scanning”, “clean”, “infected”, “scan_failed”. Lalu tambahkan aturan akses di samping masing-masing. Siapa yang bisa melihat berkas, mengunduhnya, atau menghapusnya saat masih belum dipercaya?
Selanjutnya, pilih pendekatan yang sesuai dengan volume Anda dan tujuan pengalaman pengguna. Pemindaian inline lebih mudah dijelaskan, tetapi bisa membuat unggahan terasa lambat. Pemindaian asinkron lebih mudah diskalakan untuk aplikasi yang banyak dokumen, tetapi menambah state, antrean, dan UI “pending”.
Cara praktis untuk bergerak dari desain ke pembangunan adalah membuat prototipe alur penuh end-to-end menggunakan dokumen realistis (PDF, file Office, gambar, arsip) dan perilaku pengguna realistis (beberapa unggahan, membatalkan, retries). Jangan berhenti pada “scannernya bekerja”. Validasi bahwa aplikasi tidak pernah menyajikan berkas karantina, bahkan secara tidak sengaja.
Berikut rencana pembangunan sederhana yang bisa Anda eksekusi dalam seminggu:
- Definisikan state berkas, transisi, dan aturan akses dalam satu halaman
- Pilih pemindaian inline, asinkron, atau hybrid dan dokumentasikan tradeoff-nya
- Implementasikan upload -> penyimpanan karantina -> job scan -> callback hasil, dengan log audit
- Bangun state UI yang akan dilihat pengguna (pending, blocked, failed, approved)
- Tambahkan monitoring dari hari pertama: ukuran backlog, rate kegagalan, dan waktu-ke-bersih
Jika Anda membangun tanpa kode, AppMaster bisa membantu memodelkan metadata berkas (status, pemilik, checksum, cap waktu), membangun layar unggah dan tinjau, dan mengorkestrasikan alur pemindaian dengan logika bisnis dan pemrosesan bergaya antrean. Itu memungkinkan Anda menguji alur produk nyata lebih awal, lalu mengeraskan bagian yang penting: permission, pemisahan penyimpanan, dan retry yang andal.
Akhirnya, tentukan apa arti “baik” secara angka. Tetapkan ambang alert sebelum peluncuran, sehingga Anda memperhatikan pemindaian macet dan peningkatan kegagalan sebelum pengguna mengetahuinya.


