diff --git a/apps/web/src/components/knowledge/WikiLinkRenderer.tsx b/apps/web/src/components/knowledge/WikiLinkRenderer.tsx index aad0b63..25b5400 100644 --- a/apps/web/src/components/knowledge/WikiLinkRenderer.tsx +++ b/apps/web/src/components/knowledge/WikiLinkRenderer.tsx @@ -56,14 +56,20 @@ function parseWikiLinks(html: string): string { const trimmedSlug = slug.trim(); const text = displayText?.trim() ?? trimmedSlug; + // Validate slug contains only safe characters + if (!/^[a-zA-Z0-9\-_./]+$/.test(trimmedSlug)) { + // Invalid slug - return original text without creating a link + return escapeHtml(match); + } + // Create a styled link // Using data-wiki-link attribute for styling and click handling - return `${escapeHtml(text)}`; }); } diff --git a/apps/web/src/components/mindmap/MermaidViewer.tsx b/apps/web/src/components/mindmap/MermaidViewer.tsx index a45aedf..41568a9 100644 --- a/apps/web/src/components/mindmap/MermaidViewer.tsx +++ b/apps/web/src/components/mindmap/MermaidViewer.tsx @@ -36,10 +36,10 @@ export function MermaidViewer({ theme: isDark ? "dark" : "default", flowchart: { useMaxWidth: true, - htmlLabels: true, + htmlLabels: false, curve: "basis", }, - securityLevel: "loose", + securityLevel: "strict", }); // Generate unique ID for this render