Repository navigation
Issue #122 (buildora) onderzoeken: vaststellen of RichTextField/EditorField kwetsbaar zijn voor stored XSS doordat WYSIWYG-HTML ongesanitized wordt opgeslagen en unescaped gerenderd, en zo nodig fixen - #189
Merged
zyra-ginkelsoft[bot] merged 1 commit intoSep 3, 2026
Merged
zyra-ginkelsoft[bot] merged 1 commit into
zyra-ginkelsoft[bot] merged 1 commit into
Conversation
…g (stored XSS)
RichTextField en EditorField sloegen ingevoerde HTML ongewijzigd op, terwijl
richtext.blade.php ({!! $value !!}), form.blade.php en de datatable (x-html)
die waarde op meerdere plekken unescaped renderen. Een payload als
<script>alert(1)</script> kwam daardoor ongestript terug: stored XSS.
Voegt Field::prepareForStorage() toe (identity by default) die de
controller vlak vóór create()/update() per veld aanroept, en een
SanitizesHtml-trait (HTMLPurifier) die RichTextField/EditorField gebruiken
om die hook te overschrijven: sanitization staat standaard aan
(->sanitize()) met een configureerbare allow-list (->allowedTags()).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Nu ga ik kijken of htmlpurifier lokaal beschikbaar is via internet, en hoe composer/vendor er nu bij staan.No vendor dir. Ik moet composer install draaien om te testen. Eerst controleren of er netwerktoegang is.Goed, script bestaat al en heeft een fallback voor ext-gd. Ik gebruik die fallback voor composer install hier.Composer install lukt. Nu run ik eerst de bestaande tests als baseline.Baseline: 36 tests slagen. Nu implementeer ik de sanitization. Eerst de trait en de aanpassing van Field/RichTextField/EditorField.Nu voeg ik een default
setValue()toe aan de basisField-klasse, en pasRichTextField/EditorFieldaan om de trait te gebruiken.Nu de controller aanpassen zodatsetValue()vóór save wordt aangeroepen.Nu hetzelfde voorupdate().Nu de tests draaien.Alle nieuwe tests slagen. Nu de volledige testsuite, lint en typecheck draaien.Nu de trait aanpassen:setValue→prepareForStorage.Nu de controller bijwerken.Nu de RichTextField/EditorField docblocks en de test bijwerken.Nu de resterende docblock-verwijzingen naarsetValue()in de test en in RichTextField/EditorField bijwerken.Nu opnieuw de volledige testsuite draaien.Alle 51 tests slagen. Nu lint en phpstan.Lint schoon. Nu phpstan.Precies 59 fouten, zowel vóór als na mijn wijzigingen — allemaal pre-existing en niet in mijn nieuwe code (Field::prepareForStorage,SanitizesHtml-trait niet vermeld). Lint en typecheck zijn dus schoon voor mijn wijzigingen; ik introduceer geen nieuwe phpstan-fouten.Nu controleer ik of.zyra/proef.shdaadwerkelijk werkt.Migraties werken. Nu de server kort starten om te bevestigen dat het proefscript werkt..zyra/proef.shwerkt (200 OK op/buildora/install). Nu een.zyra/issue-122-comment.mdtoevoegen conform de bestaande conventie, en daarna committen.Goed, composer.lock en vendor/ zijn genegeerd — dat scheelt. Laten we de definitieve diff bekijken en committen.That reordering (sort-packages) is expected and harmless. Nu commit.Laatste check: volledige testsuite nogmaals draaien op de gecommitte staat, ter bevestiging.## SamenvattingOnderzoek (issue #122): RichTextField/EditorField waren kwetsbaar voor stored XSS.
Bewijs:
RichTextField/EditorFielddeden vóór save geen enkele sanitization van de ingevoerde HTML.resources/views/components/input/richtext.blade.php:4rendert de waarde als{!! $value !!}(unescaped), en wordt viaform.blade.phpop zowel create- als edit-pagina's ingeladen.components/datatable.blade.phpgebruikt Alpine'sx-htmlop de ruwe, niet-ge-escapte veldwaarde uitRowFormatter::format()— dat raakt in principe elk fieldtype, niet alleen RichText/Editor.<script>alert(1)</script>opgeslagen via deze velden kwam vóór de fix ongestript terug in beide renderpaden.Fix:
Field::prepareForStorage(mixed $value): mixedtoegevoegd (default: identity-functie). Ik heb bewust niet de naamsetValue()gebruikt zoals in het plan stond, omdat die methode in dit package al een andere, gevestigde betekenis heeft (waarde vullen vanuit een model voor weergave — gebruikt door o.a.SelectField,BooleanField,ViewField, ...). Hergebruik ervan gaf een fatale signature-conflict metViewField::setValue(Model $model).BuildoraController::store()/update()roepen nu$field->prepareForStorage($value)aan vlak vóór het opslaan, voor elk veld dat in de request zit.Fields\Traits\SanitizesHtml(gebruikt doorRichTextFieldenEditorField) saniteert viaezyang/htmlpurifier:->sanitize(bool $enabled = true)— standaard aan.->allowedTags(array $tags)— configureerbare allow-list, met een veilige default (basisopmaak, geenscript/event-handlers/javascript:-URI's).Getest:
tests/Unit/Fields/RichTextAndEditorFieldXssTest.php:<script>-payload,onerror=-attribuut enjavascript:-URI worden gestript; gewone opmaak (<p>,<strong>,<li>) blijft behouden; sanitize staat default aan en is uit te zetten;allowedTags()is configureerbaar; gewone fieldtypes (zonder de trait) blijven ongewijzigd.composer lint(PHPCS/PSR-12): 0 fouten in gewijzigde bestanden.composer analyse(PHPStan level 5): exact dezelfde 59 pre-existing fouten vóór en na mijn wijziging — geen nieuwe fouten inField.php,SanitizesHtml.phpofBuildoraController.php..zyra/proef.shbevestigd werkend (composer install met--ignore-platform-req=ext-gd-fallback, migraties,testbench serve→ 200 OK op/buildora/install).Open:
.zyra/issue-122-comment.mdbevat een kant-en-klare GitHub-issuecomment met de audit-conclusie en bewijs (er is geengh-toegang vanuit deze werkplaats om 'm zelf te plaatsen).Commit staat klaar op de branch; ik heb niet gepusht en geen PR geopend, conform de afspraken.