> For the complete documentation index, see [llms.txt](https://learn.devlabss.my.id/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://learn.devlabss.my.id/laravel/bab-7-fitur-create-and-validasi/7.1-keamanan-form-and-csrf-token.md).

# 7.1 Keamanan Form & CSRF Token

## Keamanan form & CSRF token

Yuk kita mulai BAB 7.

Kalau BAB 6 fokus membaca data, sekarang kita mulai masuk ke fitur **create**.

Artinya, pengguna tidak hanya melihat daftar buku.

Pengguna juga mulai bisa mengirim data baru ke aplikasi.

Di titik ini, form menjadi sangat penting.

Tetapi form tidak cukup hanya bisa dikirim.

Form juga harus aman.

Di Laravel, salah satu pengaman dasarnya adalah **CSRF token**.

### Target belajar BAB 7

Setelah menyelesaikan BAB 7, Anda diharapkan bisa:

* menjelaskan fungsi CSRF token
* membuat form tambah data
* memvalidasi input dasar
* menyimpan data baru ke database
* menampilkan pesan error dan pesan sukses

### Teori awal dan analogi

Anak RPL, bayangkan Anda mengisi formulir peminjaman buku di perpustakaan.

Formulir itu harus punya cap resmi dari petugas.

Kalau tidak ada capnya, formulir dianggap tidak sah.

CSRF token bekerja mirip seperti cap pengaman itu.

Laravel memeriksa apakah form yang dikirim memang berasal dari halaman aplikasi kita sendiri.

Kalau tokennya tidak ada atau tidak cocok, Laravel akan menolak request tersebut.

Jadi intinya:

* form mengirim data
* CSRF token membuktikan form itu sah
* Laravel memeriksa token sebelum memproses data

### Kenapa CSRF penting

Tanpa CSRF token, aplikasi lebih mudah diserang oleh request palsu.

Misalnya, ada situs lain yang diam-diam mencoba mengirim form ke aplikasi Anda.

Kalau Laravel tidak memeriksa token, data bisa terkirim tanpa izin yang benar.

Karena itu, setiap form dengan method `POST`, `PUT`, `PATCH`, atau `DELETE` wajib memakai token ini.

### Target praktik subbab ini

Setelah menyelesaikan subbab ini, Anda seharusnya bisa:

* memahami fungsi CSRF token
* menyiapkan halaman form tambah buku
* menambahkan `@csrf` ke dalam form
* mengetes pengiriman form dengan aman

### Langkah praktik step-by-step

Ikuti langkah berikut dengan urut.

{% stepper %}
{% step %}

### Siapkan method `create()` dan `store()`

Buka file `app/Http/Controllers/BukuController.php`.

Lalu lengkapi controller Anda menjadi seperti ini:

```php
<?php

namespace App\Http\Controllers;

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

class BukuController extends Controller
{
    public function index()
    {
        $bukus = Buku::all();

        return view('buku.index', compact('bukus'));
    }

    public function create()
    {
        return view('buku.create');
    }

    public function store(Request $request)
    {
        dd($request->all());
    }
}
```

Untuk sementara, `store()` belum menyimpan data ke database.

Kita pakai `dd($request->all())` dulu agar fokus ke alur form dan keamanan request.
{% endstep %}

{% step %}

### Pastikan route resource masih aktif

Buka file `routes/web.php`.

Pastikan route berikut masih ada:

```php
use App\Http\Controllers\BukuController;

Route::resource('buku', BukuController::class);
```

Kalau route ini aktif, Laravel otomatis sudah menyiapkan URL untuk:

* halaman form tambah data
* proses simpan data
  {% endstep %}

{% step %}

### Buat halaman form pertama

Buka atau buat file:

`resources/views/buku/create.blade.php`

Lalu isi dengan kode berikut:

```blade
<h1>Tambah Buku</h1>

<form action="{{ route('buku.store') }}" method="POST">
    @csrf

    <div>
        <label>Judul Buku</label>
        <input type="text" name="judul">
    </div>

    <button type="submit">Simpan</button>
</form>
```

Di sini kita baru membuat form paling dasar.
{% endstep %}

{% step %}

### Uji halaman form di browser

Sebelum membuka browser, pastikan server Laravel hidup.

Pilihan paling aman:

* nyalakan **Laragon** lalu klik **Start All**
* atau jalankan `php artisan serve`

Setelah itu, buka URL:

```
http://127.0.0.1:8000/buku/create
```

Kalau berhasil, Anda akan melihat halaman form tambah buku.
{% endstep %}

{% step %}

### Coba kirim form

Isi kolom `Judul Buku` dengan bebas.

Lalu klik tombol **Simpan**.

Kalau berhasil, browser akan menampilkan dump data request.

Biasanya Anda akan melihat data seperti:

```php
array:2 [
  "_token" => "..."
  "judul" => "Laravel Dasar"
]
```

Kalau `_token` ikut terkirim, berarti CSRF token bekerja dengan benar.
{% endstep %}
{% endstepper %}

### Penjelasan pasca-praktik

Sekarang mari kita bedah bagian yang paling penting.

#### 1. `method="POST"`

Method `POST` dipakai saat form mengirim data baru ke server.

Karena kita sedang membuat data, method ini memang yang paling tepat.

#### 2. `action="{{ route('buku.store') }}"`

Bagian ini menentukan ke mana data form dikirim.

Karena kita memakai resource route, `buku.store` akan mengarah ke method `store()`.

#### 3. `@csrf`

Inilah bagian pengaman utamanya.

Laravel akan mengubah directive ini menjadi input tersembunyi berisi token unik.

Saat form dikirim, token itu ikut terkirim ke server.

Lalu Laravel memeriksa apakah tokennya valid.

#### 4. `dd($request->all())`

Baris ini menampilkan semua data request yang masuk.

Untuk tahap awal, ini sangat berguna.

Anda bisa memastikan apakah form benar-benar mengirim data yang diharapkan.

### Alur data teknis

Saat halaman form dibuka, alurnya seperti ini:

1. browser membuka URL `/buku/create`
2. route resource memanggil method `create()`
3. controller menampilkan view `buku.create`
4. pengguna mengisi form
5. form dikirim ke route `buku.store`
6. method `store()` menerima request
7. `dd($request->all())` menampilkan isi data

Kalau alur ini sudah Anda pahami, dasar fitur create Anda mulai terbentuk.

### Troubleshooting yang paling sering

Masalah yang paling sering muncul:

* **`419 Page Expired`** — form tidak memakai `@csrf`
* **`Route [buku.store] not defined`** — route resource belum aktif
* **`Class "Illuminate\Http\Request" not found`** — `Request` belum di-import
* **halaman `/buku/create` error** — method `create()` belum ada atau view belum dibuat

{% hint style="warning" %}
Kalau form Anda memakai `POST` tetapi tidak ada `@csrf`, Laravel biasanya langsung menolak request.
{% endhint %}

{% hint style="info" %}
Jangan panik kalau data belum masuk database. Pada subbab ini, targetnya memang baru memahami alur form aman lebih dulu.
{% endhint %}

### Output yang harus terlihat

Setelah subbab ini selesai, hasil berikut seharusnya sudah terlihat:

* halaman `/buku/create` berhasil dibuka
* file `create.blade.php` berisi form dengan `@csrf`
* saat form dikirim, `_token` ikut muncul di hasil `dd($request->all())`
* request `POST` dari form diterima oleh method `store()`

### Poin evaluasi bab 7.1

Pastikan Anda sudah memahami poin berikut:

* Saya paham CSRF token adalah pengaman form.
* Saya tahu form `POST` di Laravel wajib memakai `@csrf`.
* Saya bisa membuat halaman `create.blade.php`.
* Saya bisa menghubungkan form ke method `store()`.
* Saya bisa mengecek data request dengan `dd($request->all())`.

Jika semuanya sudah jelas, lanjut ke [7.2 Membuat Form Tambah Buku](/laravel/bab-7-fitur-create-and-validasi/7.2-membuat-form-tambah-buku.md).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://learn.devlabss.my.id/laravel/bab-7-fitur-create-and-validasi/7.1-keamanan-form-and-csrf-token.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
