mikexxz
全部文章

Markdown 渲染为什么必须 sanitize

一个发光的金属漏斗过滤网拦下红色尖刺恶意代码,只让干净的文档卡片通过。

Markdown 允许内嵌 HTML,这意味着“渲染用户提交的 Markdown”本质上等于“渲染用户提交的 HTML”。

一个最简单的例子

下面这段 Markdown 如果原样转成 HTML 插入页面,就会执行脚本:

看起来是一条普通评论。

<img src="x" onerror="alert(document.cookie)">

[点我](javascript:alert(1))

两层防护

  1. Markdown 转 HTML 时丢弃原始 HTML,不让它进入输出
  2. 生成 HTML 之后再按白名单清洗:只保留已知安全的标签和属性,链接只允许 http、https、mailto 等协议

第二层是兜底:即使第一层的配置以后被人改了,危险内容也到不了浏览器。

不要用黑名单。你永远列不全所有危险的东西,但可以列全所有你需要的东西。

评论

删除这条评论?

评论内容会被清除,无法恢复。