Lewati ke konten

Laravel Shieldv1.2.x

Instalasi

Panduan ini mengantar Anda dari aplikasi Laravel yang masih polos sampai Laravel Shield aktif dan mencatat kejadian, dalam sekitar 10 menit.

  • PHP ^8.2 atau lebih baru
  • Composer
  • Laravel 11, 12, atau 13
  • Database yang sudah terhubung ke aplikasi Anda
Terminal window
composer require ganadev/laravel-shield:^1.2.2

laravel-shield menarik ganadev/shield-core secara otomatis, jadi Anda tidak perlu memasang core sendiri. Provider-nya juga terdeteksi otomatis oleh Laravel package auto-discovery — tidak perlu didaftarkan manual di config/app.php.

Langkah 2 — Publish konfigurasi dan tabel

Section titled “Langkah 2 — Publish konfigurasi dan tabel”
Terminal window
# File konfigurasi
php artisan vendor:publish --provider="Ganadev\Shield\Laravel\ShieldServiceProvider" --tag=shield-config
# Migrasi database
php artisan vendor:publish --provider="Ganadev\Shield\Laravel\ShieldServiceProvider" --tag=shield-migrations
# Tampilan halaman blokir & challenge (opsional)
php artisan vendor:publish --provider="Ganadev\Shield\Laravel\ShieldServiceProvider" --tag=shield-views
# Jalankan migrasi
php artisan migrate

Hasilnya:

Tag Menulis ke Isi
shield-config config/shield.php Semua opsi konfigurasi.
shield-migrations database/migrations/ Tabel security_ip_bans dan security_events.
shield-views resources/views/vendor/shield/ Halaman blocked dan challenge.

Middleware wajib dipasang sebagai middleware global, bukan di dalam group web.

Buka bootstrap/app.php:

use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
->withMiddleware(function (Middleware $middleware): void {
$middleware->append([
\Ganadev\Shield\Laravel\Middleware\SecurityFirewallMiddleware::class,
]);
});

Kalau Shield ditaruh di dalam group web, ia tidak akan bekerja untuk beberapa kasus penting:

  1. Request ke URL yang tidak ada di router. seperti /.env. Group web baru berjalan setelah routing selesai, jadi firewall tidak pernah melihat request itu — padahal justru request itulah yang paling ingin kita tolak.
  2. Trusted cookie tidak akan bekerja. Group web berisi EncryptCookies. Kalau Shield ikut masuk ke dalam group itu, Laravel lebih dulu mendekripsi cookie, sementara Shield sendiri membaca cookie terenkripsi untuk memeriksa trusted-cookie. Akibatnya setiap pengguna yang sudah lolos challenge akan ditanya ulang terus-menerus.

Sejak 1.2.1, kondisi nomor 2 tidak lagi gagal diam-diam. Shield menulis satu peringatan di log aplikasi:

Ganadev Shield: cookie trusted diterima dalam bentuk yang sudah ter-decrypt.

Kalau Anda menemukan pesan itu, kembalikan middleware ke posisi global.

SHIELD_ENABLED=true
SHIELD_MODE=observe
SHIELD_APP_ID=my-app
SHIELD_CHALLENGE=turnstile
Variabel Isi Kapan perlu
SHIELD_MODE observe, challenge, atau enforce Selalu. Mulai dengan observe.
SHIELD_APP_ID Nama unik untuk aplikasi Anda Selalu, kalau butuh terutama agar dua aplikasi di server yang sama tidak saling berbagi ban di cache.
SHIELD_CHALLENGE turnstile, recaptcha, atau null Baru ketika Anda mau memakai challenge.

SHIELD_MODE=observe berarti Shield mencatat kejadian tetapi tidak memblokir siapa pun. Ini mode yang aman untuk pemasangan pertama.

Ini bagian yang paling sering terlewat, dan kalau sampai salah dampaknya besar.

Semua ban, challenge, dan penghitung perilaku di Shield berbasis IP klien. Kalau aplikasi Anda berada di belakang load balancer, reverse proxy, atau Cloudflare, maka Laravel secara default melihat IP proxy — bukan IP pengunjung.

Akibatnya semua orang terlihat datang dari satu IP, dan Shield bisa: memblokir semua pengguna sekaligus, memberi challenge massal, atau salah menghitung rate limit.

Kalau Anda memakai Cloudflare, allowlist ini yang perlu ditambahkan:

use Illuminate\Http\Request;
$middleware->trustProxies(
at: '173.245.48.0/20,103.21.244.0/22,103.22.200.0/22,103.31.4.0/22,141.101.64.0/18,108.162.192.0/18,190.93.240.0/20,188.114.96.0/20,197.234.240.0/22,198.41.128.0/17,162.158.0.0/15,104.16.0.0/13,104.24.0.0/14,172.64.0.0/13,131.0.72.0/22',
headers: Request::HEADER_X_FORWARDED_FOR,
);

Mulai 1.2.0, Shield otomatis menulis peringatan di log kalau header forwarded terdeteksi tanpa trusted proxy yang dikonfigurasi, atau kalau APP_URL menunjuk ke host publik sementara mode-nya challenge/enforce. Tidak perlu menjalankan perintah apa pun untuk melihatnya.

Terminal window
php artisan serve

Lalu periksa apakah semua komponen sehat:

Terminal window
php artisan shield:health

Perintah ini memeriksa koneksi database, cache, mesin Shield, konfigurasi trusted proxy, dan resolusi DNS untuk verifikasi crawler.

Shield sudah menjadwalkan shield:prune sendiri setiap hari, jadi Anda tidak perlu mendaftarkan perintahnya. Tapi Laravel hanya menjalankan jadwal itu kalau schedule:run benar-benar dieksekusi. Tambahkan cron berikut:

Terminal window
* * * * * cd /path/ke/aplikasi && php artisan schedule:run >> /dev/null 2>&1

Tanpa cron itu, tabel security_events akan tumbuh tanpa batas.

Jangan langsung masuk ke mode enforce. Urutan yang aman:

  1. Mode observe selama 1–3 hari. Shield mencatat, tidak memblokir.
  2. Baca shield:report. Cari rule yang aktif tanpa alasan, atau IP asli yang ikut kena.
  3. Naikkan mode ke challenge. Pengunjung asli mungkin terdampak sedikit, sementara penyerang belum. Amati beberapa hari lagi.
  4. Naikkan ke enforce. Perlahan.
  5. Aktifkan eskalasi ban. Biarkan durasi ban naik otomatis untuk yang mengulangi.

Setiap tahap, periksa manual release dan challenge pass rate sebagai penanda ada false positive.

Powered by PT Ganadev Multi Solusi