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 ? `
Repository: - ${escapeHtml(server.repository.url)} + ${escapeHtml(server.repository.url)}
` : ''} ${server.websiteUrl ? `
Website: - ${escapeHtml(server.websiteUrl)} + ${escapeHtml(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);