
Pendahuluan
Bayangin lagi ngerjain fitur sederhana, tapi tiba-tiba database kamu kena Mass Assignment Exception yang bikin pusing di tengah deadline. Kejadian ini sering banget menimpa developer yang buru-buru pakai User::create($request->all()) tanpa memikirkan celah keamanan di balik layar Laravel. Sebenarnya, Laravel memberikan $fillable dan $guarded bukan buat mempersulit hidup kita, tapi buat jadi benteng pertahanan data yang dikirim user secara asal-asalan.
Tips & Best Practices
Di banyak project, biasanya saya mulai dari pendekatan $fillable karena prinsip 'whitelist' jauh lebih aman daripada 'blacklist'. Saat aplikasi sudah punya banyak kolom, saya lebih suka memisahkan atribut yang sensitif seperti is_admin ke file terpisah atau logic yang lebih ketat agar tidak sengaja terpapar. Selain itu, kalau lagi buru-buru di tahap prototyping dan harus pakai $guarded = [], pastikan selalu menaruh komentar 'TODO' agar tidak lupa untuk menguncinya kembali sebelum push ke production.
Contoh Kode
Untuk kasus form profil user yang standar, biasanya kita membatasi apa saja yang boleh diubah agar user tidak iseng mengganti role mereka sendiri:
class User extends Model {
// Hanya kolom ini yang bisa di-mass assign
protected $fillable = ['name', 'email', 'bio'];
}Sedangkan kalau kamu pakai $guarded, tujuannya adalah melindungi kolom sakral:
class Product extends Model {
// Semua kolom boleh, kecuali id dan status_verifikasi
protected $guarded = ['id', 'status_verifikasi'];
}Variasi Implementasi
Kalau kita bandingkan, $fillable itu seperti daftar tamu undangan yang cuma boleh masuk, sedangkan $guarded itu seperti security yang membiarkan semua orang masuk kecuali daftar hitam yang dilarang. Kalau aplikasimu tipe yang punya puluhan kolom, $guarded mungkin terasa lebih ringkas. Tapi kalau security adalah prioritas utama, $fillable adalah cara terbaik supaya kamu tetap sadar tiap kali menambah kolom baru ke database.
Kesalahan Umum
- Lupa menambahkan kolom baru ke
$fillablesehingga data tidak tersimpan saat form submit. - Terlalu malas dan akhirnya menulis
$guarded = []di semua model tanpa pengecualian. - Menganggap
$fillablemelindungi data dari validasi, padahal ini cuma soal mass assignment. - Sering tertukar antara memakai
$fillableatau$guardedsecara bersamaan di satu model. - Mengabaikan celah saat menerima input langsung dari request tanpa sanitasi tambahan.
Ringkasan
Setelah sekian banyak drama error di console, saya sadar bahwa kunci dari fitur ini adalah kedisiplinan. Jangan melihat $fillable atau $guarded sebagai beban, tapi anggap itu sebagai pengingat supaya kita tahu persis apa yang masuk ke dalam database kita setiap harinya. Pada akhirnya, kode yang aman bukan cuma yang jalan, tapi yang meminimalisir kemungkinan kesalahan fatal di masa depan.
Komentar
Posting Komentar