From f88a459e12fc4e1ac50627f29c76eea0df454189 Mon Sep 17 00:00:00 2001 From: Scarriffle Date: Sun, 26 Jul 2026 15:58:54 +0200 Subject: [PATCH] =?UTF-8?q?Web:=20Etiketten-CSV=20gegen=20Formel-Injektion?= =?UTF-8?q?=20h=C3=A4rten?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Zellen, die mit = + - @ (oder Tab/CR) beginnen, werden mit einem vorangestellten Apostroph zu Text entschaerft. So fuehrt ein Produktname wie "=HYPERLINK(...)" beim Oeffnen der Etiketten-CSV in Excel/P-touch nicht mehr als Formel aus. Co-Authored-By: Claude Opus 4.8 --- web/src/pages/Transfer.jsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/web/src/pages/Transfer.jsx b/web/src/pages/Transfer.jsx index 42e5661..a63c2f5 100644 --- a/web/src/pages/Transfer.jsx +++ b/web/src/pages/Transfer.jsx @@ -11,7 +11,11 @@ function buildLabelCsv(rows, origin, delim = ",") { const delimRe = delim === "\t" ? "\\t" : delim; const needsQuote = new RegExp(`[${delimRe}"\\n\\r]`); const esc = (v) => { - const s = String(v ?? ""); + let s = String(v ?? ""); + // Formel-Injektion verhindern: Beginnt eine Zelle mit = + - @ (oder Tab/CR), + // koennte Excel/P-touch sie als Formel ausfuehren. Ein vorangestelltes + // Apostroph macht sie zu reinem Text. + if (/^[=+\-@\t\r]/.test(s)) s = `'${s}`; return needsQuote.test(s) ? `"${s.replace(/"/g, '""')}"` : s; }; const lines = [head.map(esc).join(delim)];