diff --git a/internal/api/handlers/v0/ui_index.html b/internal/api/handlers/v0/ui_index.html
index 38bac7f..dc437ff 100644
--- a/internal/api/handlers/v0/ui_index.html
+++ b/internal/api/handlers/v0/ui_index.html
@@ -423,13 +423,13 @@
${server.repository?.url ? `
` : ''}
${server.websiteUrl ? `
` : ''}
@@ -491,12 +491,26 @@
});
// Utility functions
+ // Safe for element-text contexts only: encodes `&`, `<`, `>`. Does NOT
+ // encode `"` or `'`, so it is unsafe inside attribute values — use
+ // escapeAttr there.
function escapeHtml(text) {
const div = document.createElement('div');
div.textContent = text;
return div.innerHTML;
}
+ // Safe for HTML attribute values per OWASP attribute-encoding rule.
+ function escapeAttr(text) {
+ if (text == null) return '';
+ return String(text)
+ .replace(/&/g, '&')
+ .replace(//g, '>')
+ .replace(/"/g, '"')
+ .replace(/'/g, ''');
+ }
+
function formatDate(dateStr) {
if (!dateStr) return '-';
const date = new Date(dateStr);