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 pakai guarded).
  • 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.