From af3090e6944c94d9f7e42540ca0d8431ebe093e1 Mon Sep 17 00:00:00 2001 From: vk Date: Wed, 11 Feb 2026 20:41:10 +0100 Subject: [PATCH] =?UTF-8?q?[P0=20Security]=20XSS-Schutz=20=E2=80=93=20Sani?= =?UTF-8?q?tize=20ProjectProposal=20Description=20Output=20(vibe-kanban=20?= =?UTF-8?q?a733735a)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Security Audit: Cross-Site Scripting (XSS) in ProjectProposal Description ### Problem In `resources/views/livewire/association/project-support/show.blade.php` Zeile 111 wird User-generierter Content **unescaped** ausgegeben: ```blade {!! $projectProposal->description !!} ``` **Angriffsvektor:** Jeder authentifizierte User mit `association_status > 1` und bezahlter Mitgliedschaft kann über `resources/views/livewire/association/project-support/form/create.blade.php` einen ProjectProposal erstellen. Das Feld `description` wird nur mit `required|string|min:5` validiert – kein HTML-Sanitizing. Ein Angreifer kann beliebiges JavaScript injizieren: ```html ``` Die App nutzt Spatie's `laravel-markdown` (League\CommonMark), das standardmäßig inline HTML **nicht** filtert. ### Lösung **Option A (empfohlen): HTML Purifier im Markdown-Renderer konfigurieren** 1. In `config/markdown.php` die CommonMark-Konfiguration anpassen, um `allow_unsafe_links` auf `false` zu setzen und `html_input` auf `'escape'` oder `'strip'` 2. Prüfe die aktuelle `config/markdown.php` – dort wird der `Spatie\LaravelMarkdown\MarkdownRenderer` konfiguriert 3. Setze in der CommonMark-Konfiguration: ```php 'commonmark' => [ 'html_input' => 'escape', // oder 'strip' – verhindert rohen HTML-Output 'allow_unsafe_links' => false, ], ``` **Option B: Input-Sanitization bei Speicherung** 1. In `app/Livewire/Forms/ProjectProposalForm.php` (oder dem Create-Component) vor dem Speichern den HTML-Content mit `strip_tags()` oder besser einem HTML Purifier bereinigen 2. Das Flux `` Component erzeugt möglicherweise gültiges HTML – prüfe, welches Format in der DB gespeichert wird **Option C: Output-Escaping** 1. Ersetze `{!! $projectProposal->description !!}` durch `{{ $projectProposal->description }}` wenn nur Plain-Text benötigt wird 2. Falls Markdown benötigt wird, nutze die sichere Markdown-Rendering-Pipeline ### Betroffene Dateien - `resources/views/livewire/association/project-support/show.blade.php:111` – XSS-Output - `resources/views/livewire/association/project-support/form/create.blade.php` – Input ohne Sanitization - `app/Livewire/Forms/ProjectProposalForm.php` – Validation Rules (falls vorhanden) - `config/markdown.php` – CommonMark Konfiguration ### Zusätzlich prüfen Scanne alle anderen `{!! !!}` Stellen in `resources/views/livewire/` (NICHT in `resources/views/flux/` – das sind Framework-Dateien). Aktuell ist nur `show.blade.php:111` betroffen, aber prüfe ob es weitere gibt. ### Vorgehen 1. `config/markdown.php` lesen und die CommonMark-Config auf `'html_input' => 'escape'` setzen 2. Prüfen, ob die Änderung den gewünschten Effekt hat (Markdown wird gerendert, HTML wird escaped) 3. Einen Pest Browser-Test oder Feature-Test schreiben, der verifiziert, dass `'); + + expect($html)->not->toContain('