文件 1.11.6

安全性

本頁整理在處理不受信任的 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。分享匯出檔前請確認內容來源。

EN