Keamanan aplikasi web bukan fitur tambahan — ia fondasi. Di Laravel, banyak perlindungan sudah tersedia "by default", tetapi tetap perlu dipahami cara kerjanya dan celah yang sering muncul di lapangan. Tiga ancaman paling umum adalah SQL Injection, Cross-Site Scripting (XSS), dan Cross-Site Request Forgery (CSRF). Mari kupas cara mencegahnya dengan contoh singkat.
1) SQL Injection: gunakan binding & Eloquent (hindari string mentah)
Masalah: Menyusun query dari input user tanpa binding membuka celah injeksi.
Buruk:
// Hindari: menyisipkan input langsung ke string
$users = DB::select("SELECT * FROM users WHERE email = '$request->email'");
Aman (binding):
$users = DB::select('SELECT * FROM users WHERE email = ?', [$request->email]);
Aman (Query Builder / Eloquent):
$user = User::where('email', $request->input('email'))->first();
Tips tambahan:
- Validasi input:
request()->validate(['email' => 'required|email']);
- Batasi mass assignment: set
protected $fillable = ['name','email'];
(atau pakaiguarded
). - Hindari
DB::raw()
kecuali benar-benar perlu dan terkontrol.
2) XSS: auto-escape Blade & sanitasi output
Masalah: Penyerang menyisipkan JavaScript berbahaya ke halaman (mis. lewat kolom komentar).
Prinsip utama: Blade meng-escape secara default dengan {{ }}
.
Aman:
<p>Nama: {{ $user->name }}</p> <!-- otomatis di-escape -->
Berisiko (hindari kecuali yakin):
{!! $comment->body !!} <!-- tidak di-escape -->
Kalau Anda harus render HTML dari user (mis. bold/italic), gunakan sanitasi (mis. whitelist tag dasar) sebelum menyimpan/menampilkan. Minimal, bersihkan input:
$clean = strip_tags($request->body, '<b><i><strong><em><ul><ol><li><p><br>');
Lainnya:
- Jangan mencetak input ke dalam atribut JavaScript/HTML tanpa escape.
- Untuk JSON di Blade:
@json($data)
agar di-escape benar. - Gunakan helper
e($value)
bila perlu escape manual.
3) CSRF: token wajib untuk mutasi data
Masalah: Penyerang "menyuruh" browser korban mengirim request berbahaya ke situs Anda.
Laravel menempatkan middleware VerifyCsrfToken
pada web routes. Pastikan setiap form POST/PUT/PATCH/DELETE menyertakan token:
<form method="POST" action="{{ route('posts.store') }}">
@csrf
<input name="title">
<button type="submit">Simpan</button>
</form>
Untuk AJAX (Axios/Fetch), kirim header token. Tambahkan meta di layout:
<meta name="csrf-token" content="{{ csrf_token() }}">
Inisialisasi Axios:
import axios from 'axios';
axios.defaults.headers.common['X-CSRF-TOKEN'] =
document.querySelector('meta[name="csrf-token"]').getAttribute('content');
Catatan: Jika memakai api.php
(stateless), CSRF biasanya tidak dipakai—gunakan mekanisme lain (JWT/Passport/Sanctum) dan CORS yang benar.
Kebiasaan Baik Tambahan
- Nonaktifkan debug di produksi:
.env => APP_DEBUG=false
. - Jaga APP_KEY kuat dan rahasiakan
.env
. - Rate limiting: di routes,
->middleware('throttle:60,1')
untuk meredam brute force. - Hash password: gunakan
Hash::make()
(Argon2/Bcrypt default Laravel).
Keamanan bukan satu fitur, melainkan kombinasi praktik baik: gunakan binding/Eloquent untuk mencegah SQL Injection, andalkan auto-escape Blade serta sanitasi untuk menutup celah XSS, dan pastikan setiap permintaan yang mengubah data membawa CSRF token. Dengan tiga pilar ini — ditambah kebiasaan baik seperti nonaktifkan debug, amankan kunci, dan batasi laju — aplikasi Laravel Anda akan jauh lebih tangguh menghadapi serangan di dunia nyata.