Markdown 渲染为什么必须 sanitize

Markdown 允许内嵌 HTML,这意味着“渲染用户提交的 Markdown”本质上等于“渲染用户提交的 HTML”。
一个最简单的例子
下面这段 Markdown 如果原样转成 HTML 插入页面,就会执行脚本:
看起来是一条普通评论。
<img src="x" onerror="alert(document.cookie)">
[点我](javascript:alert(1))
两层防护
- Markdown 转 HTML 时丢弃原始 HTML,不让它进入输出
- 生成 HTML 之后再按白名单清洗:只保留已知安全的标签和属性,链接只允许
http、https、mailto等协议
第二层是兜底:即使第一层的配置以后被人改了,危险内容也到不了浏览器。
不要用黑名单。你永远列不全所有危险的东西,但可以列全所有你需要的东西。
评论