react-markdownはデフォルトで危険URLと生HTMLを無害化する(XSS誤検知の判別)
React
セキュリティ
XSS
仕様
react-markdown は v9 以降、リンクや画像の URL を既定の urlTransform(defaultUrlTransform)で検証し、javascript: data: などの危険スキームを取り除く。許可されるのは http / https / mailto / tel と相対 URL 程度。さらに生の HTML(<script> や <iframe> など)はデフォルトでは一切レンダリングされない。
そのため、ユーザー入力の Markdown を素の react-markdown で表示しているだけなら、javascript: リンク注入や HTML 埋め込みによる XSS は既定で防がれている。
監査時の判断基準
Markdown レンダリングを XSS として指摘する前に、次を確認する。これらが無ければ多くは誤検知。
rehype-rawを使っていないか(使うと生 HTML がそのまま描画され、別途サニタイズが必須になる)。urlTransform/transformLinkUriを独自実装で上書きし、無害化を外していないか。dangerouslySetInnerHTMLで別経路にレンダリングしていないか。
アプリ側コードに href?.startsWith('http') のようなスキーム判定ロジックがあっても、それは target=_blank 付与など表示制御目的であることが多く、サニタイズ責務はライブラリ側にある。判定ロジックのバグ(例: || のつもりで ?? を使う)は論理バグではあっても、URL 無害化が効いていれば XSS にはならない。
検証方法
[x](javascript:alert(1)) や生 <img onerror=...> を含む Markdown を実際に描画し、生成 DOM の href / 要素を確認する。href が除去・置換され、HTML がエスケープされていれば既定の保護が効いている。保護を意図的に外す(rehype-raw 導入など)場合のみ、DOMPurify 等での明示的サニタイズを必須とする。