diff --git a/semantic-ai-validator-demo/src/main/resources/templates/invoice-validation.html b/semantic-ai-validator-demo/src/main/resources/templates/invoice-validation.html
index 58f71dc..5f3ea20 100644
--- a/semantic-ai-validator-demo/src/main/resources/templates/invoice-validation.html
+++ b/semantic-ai-validator-demo/src/main/resources/templates/invoice-validation.html
@@ -85,11 +85,24 @@
Testing Without Real Invoices
if (file) {
const sizeMB = (file.size / 1024 / 1024).toFixed(2);
- fileInfo.innerHTML = `📄 ${file.name} (${sizeMB} MB)`;
+ // Safely update fileInfo with separate text nodes to prevent HTML injection
+ fileInfo.textContent = ""; // Clear previous content
+ // Create emoji node
+ const emojiNode = document.createTextNode("📄 ");
+ // Create file name node
+ const fileNameNode = document.createTextNode(file.name);
+ // Create file size node
+ const fileSizeNode = document.createTextNode(` (${sizeMB} MB)`);
+ fileInfo.appendChild(emojiNode);
+ fileInfo.appendChild(fileNameNode);
+ fileInfo.appendChild(fileSizeNode);
fileInfo.style.display = 'block';
if (file.size > 10 * 1024 * 1024) {
- fileInfo.innerHTML += ' ⚠️ File too large (max 10MB)';
+ const warningSpan = document.createElement('span');
+ warningSpan.style.color = 'red';
+ warningSpan.textContent = ' ⚠️ File too large (max 10MB)';
+ fileInfo.appendChild(warningSpan);
}
} else {
fileInfo.style.display = 'none';