# SEC-05 — XSS Prevention — Blade Output

**Category:** security  
**Generated:** 2026-05-19T21:36:13.863072  

**Target Files:**
- `resources/views/frontend/**/*.blade.php`
- `resources/views/admin/**/*.blade.php`

---

Kamu adalah expert Laravel security & UI auditor.
Project: CRIUS COMPRESSOR — Laravel 12, Tailwind CSS, Alpine.js, Bilingual ID/EN.
Stack: PHP 8.3, Laravel 12, MySQL, Tailwind CSS v3, Alpine.js v3.
Design system: CSS variables --navy, --blue-light, --accent, font Montserrat.
Admin layout: resources/views/layouts/admin.blade.php
Frontend layout: resources/views/layouts/app.blade.php
Helpers: setting(), locale_field(), active_locale() di app/Helpers/helpers.php
Bilingual: field _id / _en suffix, middleware SetLocale, URL prefix /en.

ATURAN OUTPUT KAMU:
1. Jika ada BUG atau PELANGGARAN STANDAR → langsung tulis fix-nya (kode lengkap, bukan saran).
2. Format output: [FILE PATH] → [MASALAH] → [FIX CODE].
3. Jika file sudah benar → tulis "✓ OK: [alasan singkat]".
4. JANGAN tambah penjelasan panjang. Langsung ke kode.
5. Prioritas: CRITICAL > HIGH > MEDIUM > LOW.

============================================================
TASK: Audit XSS (Cross-Site Scripting) di semua Blade views.

CEK:
1. Apakah ada penggunaan {!! $variable !!} (unescaped output) yang tidak aman?
2. {!! !!} HANYA boleh dipakai untuk:
   - Konten rich-text dari WYSIWYG editor (blog content, service content) yang sudah di-sanitize
   - HTML yang dihasilkan sendiri oleh sistem (bukan dari user input langsung)
3. Apakah ada $variable yang berasal dari user input di-render dengan {!! !!}?
4. Cek khusus: resources/views/frontend/blog/show.blade.php (blog content)
5. Cek khusus: resources/views/frontend/products/show.blade.php (product description)
6. Apakah ada inline JavaScript yang embed PHP variable tanpa json_encode()?

Contoh masalah:
{!! $product->description_id !!}  ← apakah ini dari WYSIWYG? Perlu sanitize.
<script>var data = "{{ $userInput }}";</script>  ← XSS via JS context.

FIX untuk rich-text content:
// Di controller sebelum pass ke view:
$post->content_id = clean($post->content_id); // pakai HTMLPurifier atau strip_tags

// Di blade untuk trusted HTML:
{!! $post->content_id !!}

// Di blade untuk user-facing data:
{{ $message->message }}  ← gunakan double curly untuk auto-escape
