Pengantar
Laravel adalah framework yang sudah dilengkapi fitur keamanan bawaan. Namun, fleksibilitasnya memungkinkan pengembang membuat implementasi yang lebih kompleks, yang dapat memunculkan celah keamanan jika tidak hati-hati. Panduan ini dirancang untuk membantu Kamu menghindari kesalahan umum dan memastikan aplikasi Laravel tetap aman.
Dasar-Dasar Keamanan Laravel
Nonaktifkan Debug Mode di Produksi
Atur variabel lingkunganAPP_DEBUG
menjadifalse
:APP_DEBUG=false
Pastikan Application Key Telah Digenerate
Gunakan perintah berikut:php artisan key:generate
Atur Konfigurasi PHP yang Aman
Rujuk ke PHP Configuration Cheat Sheet untuk pengaturan PHP yang aman.Setel Izin File dan Direktori
Direktori: Maksimal
775
File non-eksekusi: Maksimal
664
File eksekusi (seperti Artisan): Maksimal
775
Periksa Ketergantungan yang Rentan
Gunakan Enlightn Security Checker untuk memverifikasi keamanan dependensi.
Keamanan Cookie dan Manajemen Session
Aktifkan Middleware EncryptCookies
Tambahkan middleware berikut diApp\Http\Kernel
:protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, ... ], ];
Setel HttpOnly untuk Session Cookie
'http_only' => true,
Konfigurasi Cookie Domain
Jika tidak menggunakan subdomain:'domain' => null,
Set SameSite Cookie
Pilih antaralax
ataustrict
:'same_site' => 'lax',
Aktifkan Secure Cookie untuk HTTPS
'secure' => true,
Setel Timeout Session Rendah
Rekomendasi: 15-30 menit.'lifetime' => 15,
Autentikasi
Guards dan Providers
Laravel memiliki guards untuk autentikasi dan providers untuk mengambil data pengguna.
Konfigurasi ada di file
config/auth.php
.
Starter Kits
Laravel Breeze: Autentikasi dasar.
Laravel Fortify: Headless authentication backend.
Laravel Jetstream: Starter kit lengkap dengan UI.
API Authentication
Passport: OAuth2 authentication provider.
Sanctum: API token authentication provider.
Mass Assignment
Hindari kerentanan dengan:
Menggunakan
$request->only()
atau$request->validated()
alih-alih$request->all()
.Tidak mengosongkan
$guarded
pada model.Menghindari penggunaan
forceFill
kecuali data sudah divalidasi.
SQL Injection
Proteksi Eloquent ORM
Laravel melindungi SQL injection secara bawaan dengan parameterisasi query:
User::where('email', $email)->get();
Raw Query
Gunakan binding untuk data yang tidak terpercaya:
User::whereRaw('email = ?', [$request->input('email')])->get();
Validasi Kolom
Hindari input pengguna menentukan nama kolom. Validasi input:
$request->validate(['sortBy' => 'in:price,updated_at']);
Cross Site Scripting (XSS)
Gunakan
{{ }}
untuk output aman.Hindari
{!! !!}
pada data yang tidak terpercaya.
File Upload yang Aman
Validasi Jenis dan Ukuran File
$request->validate([ 'photo' => 'file|size:100|mimes:jpg,bmp,png' ]);
Hindari Nama File dari Input Pengguna
Tetapkan nama file secara manual:$filename = Str::random(10) . '.' . $request->file('photo')->extension();
Dengan mengikuti tips ini, Kamu dapat membangun aplikasi Laravel yang lebih aman dan terhindar dari kerentanan umum.