使用方法
- 在左侧输入或粘贴 Markdown,预览随输入实时更新。
- 窄屏下两栏会自动改为上下堆叠。
- 复制 HTML 取走片段;下载 HTML 保存一个带样式的完整文件。
- 勾选 查看生成的 HTML 可以检视确切的输出。
关于「安全地渲染 Markdown」
Markdown 的设计目标是既能当纯文本读,又能干净地转成 HTML。容易被忽略的一点是:最初的 规范允许在文档里内嵌原始 HTML——这是有意留下的后门,用来表达 Markdown 本身表达不了的 东西。而这个后门同时也是问题所在。
预览工具会把你从任何地方粘来的文本,作为 HTML 插进当前页面。如果原始 HTML 能够透传,那么
粘贴一份含有 <script> 或 <img onerror=...> 的文档,就会在你的浏览器里、以你所在站点的
身份执行那段代码。这不是假想:它正是 Markdown 渲染器被攻破的标准方式,在评论系统、wiki 和
笔记应用里都造成过真实的漏洞。
本工具采取的立场很简单:先把一切转义,再套用 Markdown 语法。你输入的每一个尖括号,在 任何解析开始之前就已变成可见文本,因此输出里的每一个标签都由解析器自己生成,你写下的任何 内容都无法变成标签。代价是不支持原始 HTML 透传——如果你恰好需要它,这确实是个限制——但对 一个预览工具来说,这个取舍是对的。
不过单靠转义并不够,而这正是许多本来相当谨慎的实现失手的地方。看 [点我](javascript:alert(1)):
这里根本没有标签可供转义拦截,语法是完全合法的 Markdown,朴素的渲染器会产出
<a href="javascript:alert(1)">,点一下就会执行。防线是对链接与图片地址施加协议白名单:
只有 http、https、mailto、tel、锚点和相对路径能通过,其余保持为纯文本。这里用白名单
而不是黑名单很关键——黑名单必须预判攻击者可能尝试的每一种变形:大小写混写、在协议名中间插
一个制表符、开头塞一个空字节;而白名单根本不认识这些东西。