Keamanan & Siap Produksi
PreventRequestForgery Laravel 13, rate limiting, mode strict, hardening konfigurasi, optimasi, dan deployment.
Keamanan bawaan Laravel
Laravel melindungi dari banyak serangan umum secara default, selama kamu memakainya dengan benar:
| Ancaman | Perlindungan |
|---|---|
| SQL injection | Eloquent & query builder memakai prepared statement. Jangan menggabungkan input ke DB::raw() / whereRaw() tanpa binding. |
| XSS | {{ }} di Blade otomatis di-escape. Hindari {!! !!} untuk input pengguna. |
| CSRF | Middleware PreventRequestForgery + @csrf pada form. |
| Mass assignment | #[Fillable]/$fillable sebagai whitelist. |
| Password | Hash bcrypt/argon2 via Hash; cast hashed. |
| Session hijacking | session()->regenerate() saat login; cookie HttpOnly, SameSite. |
CSRF di Laravel 13: PreventRequestForgery
Middleware CSRF dinamai ulang menjadi Illuminate\Foundation\Http\Middleware\PreventRequestForgery (nama lama VerifyCsrfToken tetap ada sebagai alias usang). Ia bekerja dua lapis: pertama memeriksa header Sec-Fetch-Site dari browser (asal permintaan); bila tidak lolos/tersedia, mundur ke validasi token CSRF klasik. Konfigurasi di bootstrap/app.php:
->withMiddleware(function (Middleware $middleware): void {
$middleware->preventRequestForgery(except: [
'webhook/*', // mis. webhook pembayaran yang tak punya token
]);
// mengandalkan verifikasi asal saja (gagal → 403, bukan 419):
// $middleware->preventRequestForgery(originOnly: true);
// mengizinkan subdomain yang sama situs:
// $middleware->preventRequestForgery(allowSameSite: true);
})
Di tes, CSRF otomatis nonaktif. Tempatkan route webhook di luar grup web bila bisa (mis. di routes/api.php).
Rate limiting
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;
// AppServiceProvider::boot()
RateLimiter::for('login', function (Request $request) {
return Limit::perMinute(5)->by($request->input('email') . $request->ip());
});
Route::post('/login', ...)->middleware('throttle:login');
Route::middleware('throttle:60,1')->group(...); // 60 permintaan per menit
Melindungi dari brute force login, spam form, dan penyalahgunaan API. Respons yang ditolak: 429 Too Many Requests.
Mode strict di development
use Illuminate\Database\Eloquent\Model;
Model::shouldBeStrict(! app()->isProduction()); // lazy loading, atribut hilang, mass assignment diam-diam → exception
Perubahan keamanan Laravel 13 yang perlu diketahui
- Cache: opsi
serializable_classesbernilaifalsesecara bawaan — mempersulit serangan PHP deserialization bilaAPP_KEYbocor. Simpan array alih-alih objek, atau daftarkan kelas yang diizinkan. - Session:
serializationbawaan skeleton baru adalahjson(bukanphp) dengan alasan serupa. Mengubahnya pada aplikasi lama akan mengeluarkan semua pengguna yang sedang login. - Judul email reset password bawaan berubah menjadi "Reset your password".
Daftar periksa produksi
APP_ENV=production
APP_DEBUG=false # JANGAN true di produksi: membocorkan stack trace & kredensial
APP_KEY=... # php artisan key:generate (sekali, simpan aman)
php artisan config:cache && php artisan route:cache && php artisan view:cache # atau: php artisan optimize
php artisan migrate --force
php artisan queue:restart
- HTTPS wajib; paksa skema dengan
URL::forceScheme('https')di produksi. - Folder web root =
public/; berkas.envdanstoragetidak boleh bisa diakses web. - Pasang worker queue di Supervisor, jadwalkan
php artisan schedule:runtiap menit di cron. - Cadangkan database; pantau error (Nightwatch, Sentry, Flare) dan performa.
- Pembaruan dependensi:
composer audit,composer updateterencana; baca upgrade guide tiap versi mayor.
Opsi deployment
| Opsi | Keterangan |
|---|---|
| Laravel Cloud | Platform terkelola resmi: deploy dari Git, auto-scaling, database & cache terkelola |
| Laravel Forge | Mengelola server (VPS) kamu: Nginx, PHP, SSL, deploy otomatis |
| Docker / Sail / Kubernetes | Kontrol penuh & konsistensi lingkungan |
| Shared hosting / VPS manual | Murah; butuh perawatan manual |