Mengamankan Download File Berbayar: Pola yang Kami Pakai di Produksi
Kesalahan paling umum pada marketplace digital pemula: menyimpan file produk di public/storage. Satu URL bocor ke grup Telegram dan produk Anda tersebar.
Tiga lapis yang wajib ada
1. File tidak pernah berada di document root
Simpan di disk privat, di luar folder public/. Tidak ada konfigurasi web server yang bisa salah dan membocorkannya.
'products' => [
'driver' => 'local',
'root' => storage_path('app/private/products'),
'serve' => false,
],
2. Link berumur pendek, bukan permanen
Jangan berikan URL tetap. Terbitkan signed URL yang kedaluwarsa dalam hitungan menit, dibuat saat pengguna menekan tombol download.
URL::temporarySignedRoute(
'customer.downloads.file',
now()->addMinutes(60),
['download' => $download->id, 'file' => $file->id],
);
3. Otorisasi diperiksa ulang saat file diambil
Signed URL hanya membuktikan link itu kita yang buat, bukan bahwa pemegangnya masih berhak. Periksa ulang kepemilikan, kuota, dan masa berlaku di controller — dan naikkan penghitung di dalam transaksi dengan lockForUpdate agar dua permintaan paralel tidak sama-sama lolos pada slot kuota terakhir.
Jangan lupa audit trail
Catat setiap unduhan: waktu, IP, user agent, file mana. Ketika suatu saat ada dugaan penyalahgunaan lisensi, log ini yang akan menjawabnya.
Butuh implementasinya di bisnis Anda?
Kami bantu dari analisa sampai deployment.