From a07bcbe3c89b5a1decdb84b9a659233b89ad5e6a Mon Sep 17 00:00:00 2001 From: Imugiii Date: Tue, 16 Jun 2026 10:31:28 +0000 Subject: [PATCH] fix(kiosk): escape data-derived strings injected into innerHTML (RG-T15) 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. --- src/public/borne/assets/js/page-cart.js | 24 ++++++++++----------- src/public/borne/assets/js/page-product.js | 10 ++++----- src/public/borne/assets/js/page-products.js | 8 +++---- src/public/borne/assets/js/state.js | 20 +++++++++++++++++ 4 files changed, 41 insertions(+), 21 deletions(-) diff --git a/src/public/borne/assets/js/page-cart.js b/src/public/borne/assets/js/page-cart.js index 5354b83..677c4df 100644 --- a/src/public/borne/assets/js/page-cart.js +++ b/src/public/borne/assets/js/page-cart.js @@ -17,7 +17,7 @@ * requires prices shown to end-consumers to include all taxes. */ -import { getCart, removeFromCart, updateQuantity, getTotalCents, computeMenuLineCents, clearCart, formatPrice } from './state.js'; +import { getCart, removeFromCart, updateQuantity, getTotalCents, computeMenuLineCents, clearCart, formatPrice, escHtml } from './state.js'; import { refreshCartBadge } from './nav.js'; /* TVA rate used for display breakdown only — stored prices are already TTC */ @@ -62,27 +62,27 @@ function renderCart() { row.innerHTML = ` ${item.libelle}
- ${item.libelle} + ${escHtml(item.libelle)} ${formatPrice(item.prix_cents)} / unite${isMenu && (item.supplement_cents ?? 0) > 0 ? ` + ${formatPrice(item.supplement_cents)} suppl.` : ''} ${isMenu && item.composition ? renderCompositionBlock(item) : ''}
-
+
${item.quantite}
@@ -90,7 +90,7 @@ function renderCart() {