Tutorial Laravel: Validasi Input dari Form

Thumbnail Tutorial Laravel: Validasi Input dari Form

Saat ini, kita sering mendengar atau melihat banyak kasus pencurian data pada aplikasi web. Salah satu penyebab utamanya adalah tidak diterapkannya validasi input data yang dikirimkan oleh pengguna. Beberapa jenis serangan yang terjadi karena lemahnya validasi adalah SQL Injection, Cross-Site Scripting (XSS), dan Cross-Site Request Forgery (CSRF). Beruntungnya, Laravel, sebagai salah satu framework PHP paling populer, telah menyediakan mekanisme validasi input yang mudah digunakan. Artikel ini akan memberikan contoh bagaimana cara melakukan validasi input di Laravel untuk memastikan form aman dari data yang tidak valid.

Mengapa Validasi Input Penting di Aplikasi Web?

Validasi input sangat penting karena data yang tidak valid bisa merusak keamanan dan kinerja aplikasi. Laravel memberikan cara sederhana namun efektif untuk memastikan bahwa setiap input dari form telah memenuhi kriteria tertentu, seperti validasi email, panjang nilai yang dikirimkan, hingga kesesuaian tipe data. Dengan validasi yang benar, Anda bisa mencegah berbagai jenis serangan yang dapat membahayakan aplikasi web Anda.

Menyiapkan Proyek Laravel

Sebelum melangkah lebih jauh, kita asumsikan bahwa Anda sudah menyiapkan proyek Laravel yang terhubung dengan database. Pada contoh ini, kita akan menggunakan struktur tabel users bawaan Laravel. Jangan lupa untuk menjalankan perintah berikut untuk mengaktifkan migrasi tabel:

php artisan migrate

Setelah itu, buatlah controller dengan nama UserController. Anda bisa menggunakan perintah berikut untuk membuatnya:

php artisan make:controller UserController

Implementasi Validasi Input di Laravel

Di dalam UserController, simpanlah kode berikut untuk memvalidasi input data yang dikirimkan melalui form:

<?php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;

class UserController extends Controller
{
    public function index() {
        return view('users');
    }
    
    public function store(Request $request) {
        // validasi input
        $validatedData = $request->validate([
            'name' => 'required|string|min:3|max:50',
            'email' => 'required|email:dns|unique:users,email',
            'password' => 'required|string|min:8|max:32',
            'confirm_password' => 'required|string|same:password'
        ]);
        
        // kode di bawah ini akan berjalan jika semua validasi terpenuhi
        unset($validatedData['confirm_password']);
        User::create($validatedData);
        
        return redirect()->back()->with('success', 'User berhasil ditambahkan');
    }
}

Kode di atas memastikan bahwa name harus berupa string dengan panjang minimal 3 dan maksimal 50 karakter, email harus valid dan unik di tabel users, password minimal 8 karakter, dan confirm_password harus sama dengan password yang diinput.

Membuat Tampilan Form dengan Blade

Selanjutnya, buatlah tampilan form HTML yang bisa digunakan untuk menambah data user. Simpan kode berikut di dalam file users.blade.php di folder resources/views:

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Validasi Input - By Kode Fiksi</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
  </head>
  <body>
    <div class="container">
        <form action="{{ route('users.store') }}" method="POST" class="mt-5 mx-auto col-lg-6">
            @if (session('success'))
                <div class="alert alert-success alert-dismissible fade show" role="alert">
                    {{ session('success') }}
                    <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
                </div>
            @endif
            @csrf
            <div class="mb-3">
                <label for="name" class="form-label">Name</label>
                <input type="text" class="form-control @error('name') is-invalid @enderror" id="name" name="name" value="{{ old('name') }}">
                @error('name')
                    <div class="invalid-feedback">{{ $message }}</div>
                @enderror
            </div>
            <div class="mb-3">
                <label for="email" class="form-label">Email</label>
                <input type="text" class="form-control @error('email') is-invalid @enderror" id="email" name="email" value="{{ old('email') }}">
                @error('email')
                    <div class="invalid-feedback">{{ $message }}</div>
                @enderror
            </div>
            <div class="mb-3">
                <label for="password" class="form-label">Password</label>
                <input type="password" class="form-control @error('password') is-invalid @enderror" id="password" name="password">
                @error('password')
                    <div class="invalid-feedback">{{ $message }}</div>
                @enderror
            </div>
            <div class="mb-3">
                <label for="confirm_password" class="form-label">Confirm Password</label>
                <input type="password" class="form-control @error('confirm_password') is-invalid @enderror" id="confirm_password" name="confirm_password">
                @error('confirm_password')
                    <div class="invalid-feedback">{{ $message }}</div>
                @enderror
            </div>
            <button type="submit" class="btn btn-primary">Submit</button>
        </form>
    </div>
  </body>
</html>

Menambahkan Route untuk Controller

Agar form yang telah kita buat bisa berfungsi, tambahkan routing untuk mengakses fungsi di UserController. Pada file web.php, tambahkan baris berikut:

<?php

use App\Http\Controllers\UserController;
use Illuminate\Support\Facades\Route;

Route::controller(UserController::class)
    ->group(function () {
        Route::get('/', 'index')->name('users.index');
        Route::post('/', 'store')->name('users.store');
    });

Penjelasan Validasi Input di Laravel

Pada contoh ini, proses validasi dilakukan dengan metode validate() di dalam controller. Laravel menyediakan berbagai aturan validasi yang bisa Anda gunakan, seperti:

  • required: Field wajib diisi.
  • string: Tipe data harus berupa string.
  • min: Jumlah karakter minimal.
  • max: Jumlah karakter maksimal.
  • unique:users,email: Data harus unik di tabel users pada kolom email.
  • same:password: Harus sama dengan input password.

Baca juga: Cara Mudah Implementasi JWT di Laravel 11.

Selain itu, Laravel menyediakan fitur CSRF untuk melindungi aplikasi dari serangan Cross-Site Request Forgery. Token CSRF secara otomatis dimasukkan ke dalam form menggunakan @csrf.

Optimasi Validasi dengan Form Request

Jika Anda memiliki validasi yang kompleks, Laravel memungkinkan Anda untuk memisahkan aturan validasi ke dalam Form Request. Untuk membuatnya, jalankan perintah:

php artisan make:request UserPostRequest

Pindahkan validasi dari controller ke dalam UserPostRequest.php. Isi file ini akan terlihat seperti berikut:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class UserPostRequest extends FormRequest
{
    public function authorize(): bool
    {
        return true; // semua pengguna diizinkan
    }
    
    public function rules(): array
    {
        return [
            'name' => 'required|string|min:3|max:50',
            'email' => 'required|email:dns|unique:users,email',
            'password' => 'required|string|min:8|max:32',
            'confirm_password' => 'required|string|same:password'
        ];
    }
}

Kemudian ubahlah fungsi store() yang ada pada UserController.php menjadi seperti ini:

public function store(UserPostRequest $request) {
    // validasi input
    $validatedData = $request->validated();
    // ...
}

Jangan lupa panggil juga class tersebut tepat setelah namespace.

use App\Requests\UserPostRequest;

Sekarang cobalah untuk menguji validasi input dengan mengirimkan nilai-nilai yang tidak sesuai dengan salah satu aturan validasi yang telah ditetapkan. Apabila berhasil, seharusnya akan seperti yang ada pada gambar di bawah ini.

Contoh Hasil Validasi Input di Laravel

Tidak hanya sampai seperti di atas, Anda dapat mengembangkan aturan validasi lebih jauh lagi. Karena Laravel telah menyediakan berbagai fitur untuk pengembang mengeluarkan kreativitasnya, seperti mengganti pesan error validasi yang muncul, mengganti ke bahasa lain, hingga membuat aturan validasi sendiri. Semuanya dapat Anda ketahui di dokumentasi Laravel, jangan malas untuk membaca dokumentasi ya!

Kesimpulan

Penerapan validasi input di Laravel sangat penting untuk menjaga keamanan aplikasi web dari serangan seperti SQL Injection, XSS, dan CSRF. Laravel menyediakan fitur validasi yang mudah digunakan dan fleksibel, sehingga Anda dapat memastikan data yang diterima aplikasi adalah data yang valid. Dengan memisahkan validasi ke dalam Form Request, Anda juga bisa menjaga kebersihan dan keterbacaan kode. Pastikan selalu menerapkan validasi input untuk meningkatkan keamanan dan performa aplikasi web Anda.