🔒 security: renderMarkdown URL validation (javascript: edge case XSS) #130

Closed
opened 2026-05-14 20:31:38 +00:00 by lekss361 · 0 comments
lekss361 commented 2026-05-14 20:31:38 +00:00 (Migrated from github.com)

Per audit batch #127 P2 security minor.

Risk

frontend/src/app/docs/b2b-channels/page.tsx:62 использует dangerouslySetInnerHTML с результатом renderMarkdown(). Hand-rolled renderer HTML-escape'ит текст, но inline links [text](url) substituted в href="$2" verbatim. Если markdown source когда-либо станет user-supplied — [click](javascript:alert(1)) execute'нется при click.

Currently low risk (source — build-time fs.readFileSync из public/docs/), но защита-в-глубину.

Fix

В inlineMd (или wherever inline-link replace happens) добавить guard:

const safeUrl = url.startsWith('http://') || url.startsWith('https://') || url.startsWith('/')
  ? url
  : '#';

Acceptance

  • URL validation guard в renderMarkdown
  • Test: [click](javascript:alert(1)) → href="#"
  • Existing [text](https://...) / [text](/path) работают

Refs: #127

Per audit batch #127 P2 security minor. ## Risk `frontend/src/app/docs/b2b-channels/page.tsx:62` использует `dangerouslySetInnerHTML` с результатом `renderMarkdown()`. Hand-rolled renderer HTML-escape'ит текст, но **inline links** `[text](url)` substituted в `href="$2"` verbatim. Если markdown source когда-либо станет user-supplied — `[click](javascript:alert(1))` execute'нется при click. Currently low risk (source — build-time fs.readFileSync из `public/docs/`), но защита-в-глубину. ## Fix В `inlineMd` (или wherever inline-link replace happens) добавить guard: ```ts const safeUrl = url.startsWith('http://') || url.startsWith('https://') || url.startsWith('/') ? url : '#'; ``` ## Acceptance - [ ] URL validation guard в renderMarkdown - [ ] Test: `[click](javascript:alert(1))` → href="#" - [ ] Existing `[text](https://...)` / `[text](/path)` работают Refs: #127
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#130
No description provided.