# 安全性

本頁整理在處理不受信任的 Markdown 時需要知道的行為：HTML 原樣輸出、外部請求，以及第三方腳本來源。

## HTML 不會被過濾

`transToHTML()` 不做 sanitize。內文中的 HTML 標籤與屬性原樣保留，`MDViewer` 再以 `innerHTML` 寫入頁面：

```markdown
<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 | 見 [執行期依賴](/runtime-dependencies) |
| 內容含 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`。分享匯出檔前請確認內容來源。
