安全性
本頁整理在處理不受信任的 Markdown 時需要知道的行為:HTML 原樣輸出、外部請求,以及第三方腳本來源。
HTML 不會被過濾
transToHTML() 不做 sanitize。內文中的 HTML 標籤與屬性原樣保留,MDViewer 再以 innerHTML 寫入頁面:
<img src=x onerror="alert(document.cookie)">
這段在預覽器中會直接執行。只有行內 code、程式碼區塊內的文字會被跳脫。
| 情境 | 風險 | 建議 |
|---|---|---|
| 使用者編輯自己的內容 | 低:只影響自己 | 可直接使用 |
| 預覽他人提交的 Markdown | 高:儲存型 XSS | 不要用 MDViewer 顯示;改用 MDParser 輸出後經 DOMPurify 等工具過濾再寫入 |
| 伺服器端轉換後再發佈 | 高 | 同上,過濾後再存入 |
MDViewer 沒有提供在寫入前攔截 HTML 的掛鉤,所以預覽器只適合顯示可信任的內容。
連結
所有連結都是 target="_blank",沒有加 rel。現行主流瀏覽器對 _blank 預設套用 noopener,但舊版瀏覽器的開啟頁面仍可透過 window.opener 改寫原頁。
外部請求
| 觸發 | 請求對象 | 說明 |
|---|---|---|
| bundle 載入 | jsDelivr、Google Fonts | 見 執行期依賴 |
| 內容含 YouTube 連結 | i.ytimg.com |
載入縮圖,點擊後才載入 iframe |
| 內容含 Vimeo 連結 | vimeo.com/api/v2 |
每次轉換時同步 XHR 查詢縮圖 |
| 內容含外部圖片/影片 | 圖片所在網域 | 預覽時即載入,可被用來追蹤閱讀者 IP |
| 部署按鈕 | nanomd-deploy.pardn.workers.dev |
只在 nanomd.pardn.io 出現,內容會上傳 |
第三方腳本版本
code-prettify 由 gh/google/code-prettify@master 載入,指向會變動的分支而不是固定版本,也沒有 Subresource Integrity。對供應鏈有要求的環境,建議自行託管 code-prettify 與 Mermaid,並在 NanoMD 之前放好 window.PR 與 window.mermaid。
匯出的 HTML
download("html") 產出的檔案同樣包含未過濾的原始 HTML,並從 jsDelivr 載入 run_prettify.js。分享匯出檔前請確認內容來源。