fix(kiosk): escape data-derived strings in innerHTML (RG-T15) #20
No reviewers
Labels
No labels
auto-merge
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: AcadeNice/corentin_wakdo#20
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/p3-kiosk-escape-xss"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
RG-T15 (echappement sortie anti-XSS) — borne
docs/merise/mlt.md(RG-T15) impose que toute chaine derivee des donnees du catalogue rendue en HTML cote borne soit echappee (textContent ou echappeur explicite, pasinnerHTMLbrut). Seulpage-product-menu.jsdefinissait et appliquaitescHtml(); les 3 autres scripts de rendu injectaientproduct.nom/item.libelle/product.imagedirectement dansinnerHTMLsans echappement.Sink le plus net :
src="${product.image}"(une valeur image typex" onerror="..."casse hors de l'attribut).Correctif
escHtml()centralise et exporte depuisstate.js(source unique, deja importee par les modules de page) au lieu d'etre duplique localement.page-products.js,page-product.js,page-cart.js: texte visible + attributssrc/alt/aria-labeldes templatesinnerHTML, plus les 4libelledu bloc composition menu.document.title = ...(assignation de texte) etel.setAttribute('aria-label', ...)(pas de parsing HTML).Portee
Donnees statiques aujourd'hui (
data/*.jsonecrites par le dev) -> pas exploitable maintenant. Maisdata.jsdocumente le bascule P4 vers/api/products: ces memes champs deviendront des valeurs CRUD admin en base. Le CRUD produits admin etant deja merge (#17), cet echappement ferme une XSS stockee latente sur borne avant que l'API ne la rende vivante.Validation : syntaxe ES module OK (
node --check) sur les 4 fichiers ; aucune injectioninnerHTMLdata-derived non echappee restante. Pas de labelauto-merge: relecture manuelle.RG-T15 (mlt.md) impose d'echapper toute valeur de catalogue rendue en HTML cote borne. Seul page-product-menu.js definissait/appliquait escHtml ; les 3 autres scripts de rendu injectaient product.nom / item.libelle / product.image directement dans innerHTML sans echappement. - escHtml centralise et exporte depuis state.js (source unique, importe par les modules de page) au lieu d'etre duplique localement. - Echappement applique aux champs data-derived dans page-products.js, page-product.js et page-cart.js (texte + attributs src/alt/aria-label des templates innerHTML, dont le sink src="${image}"). Les chemins document.title et setAttribute(...) restent inchanges : ce ne sont pas des sinks HTML (assignation de texte, pas de parsing). Donnees statiques aujourd'hui (data/*.json), mais data.js documente le bascule P4 vers /api/products : ces memes champs deviendront des valeurs CRUD admin en base, d'ou le risque de XSS stockee sur borne que cet echappement ferme.