Markdown 解释为 HTML 的时候如何防止有恶意代码

2016-02-10 23:19:20 +08:00
 hxsf

背景

类似于 github 和 V 站的 markdown 使用场景

目前情况:前后端都是使用 marked 做解释器。

比如下面这个 markdown 文件。

# title

<a href="#" onclick="do sth...">link</a>
<script>
    do sth...
</script>

```
<script>
    do sth...
</script>
```

被解释的时候不管是 a 标签内的 onclick 还是 script 标签内的 js ,都会被插入到 html 里。

还是这个文件,放 github 的编辑器里测试了下,前两者都不会被插入到 html 里,而```内的不受影响

看了下貌似是因为 github 的做法是只支持部分语法,并不是支持所有 html 标签( V 站貌似也是这样的)。

我自己的考虑:

  1. 前端生成 DOM 后,先移除其中的 script 标签。 但是对于绑定的事件无效。
  2. 生成 DOM 前,查找 script 标签和 onclick 等字符串,(我自己也觉得这个很不靠谱。。。 233 )
  3. 求类似 github/v2ex 用的这种支持部分语法的 markdown 翻译器推荐
  4. marked 有相关配置?(第一次用这个,求告知)

过年这几天貌似冒泡的都不多 (忧桑...)

求不沉 T^T

3320 次点击
所在节点    问与答
14 条回复
virusdefender
2016-02-10 23:22:28 +08:00
前端生成的时候我觉得不需要过滤,因为这是 self xss ,不影响别人。

后端过滤的时候讲 ``` 里面的全部转义,外面的过滤标签和属性。
skydiver
2016-02-10 23:27:23 +08:00
@virusdefender 怎么会不影响别人?写的人和看的人不一定是一个人吧
virusdefender
2016-02-10 23:33:18 +08:00
@skydiver 你说的就是可以多人编辑的,我理解错了。那前端预览和后端渲染的时候都过滤 html 就好了。
virusdefender
2016-02-10 23:34:57 +08:00
techmoe
2016-02-10 23:35:25 +08:00
后端过滤相应 html 标签呗
chemzqm
2016-02-11 00:31:42 +08:00
简单点,除了代码块里面的标签都过滤掉
ericls
2016-02-11 03:25:45 +08:00
标签白名单
14ly
2016-02-11 03:28:49 +08:00
把 dom 弄出来,内容用 innerText 搞
Andy1999
2016-02-11 04:50:56 +08:00
简单点 不允许 html 标签
hxsf
2016-02-11 09:14:35 +08:00
@virusdefender
@techmoe
@chemzqm
@ericls
@14ly
@Andy1999
那如何防止 onclick 这种
virusdefender
2016-02-11 10:11:12 +08:00
@hxsf 看我上面发的链接
zsx
2016-02-11 12:10:17 +08:00
https://github.com/leizongmin/js-xss 我也晒一个 xss 过滤库
主要是 tagName 和 attr 都要有白名单限制,针对 href/src 还要特别限制路径, style 对 css 属性也要进行单独过滤,若考虑到 IE 的话还要研究 expression 表达式的过滤。
ericls
2016-02-11 13:35:46 +08:00
@hxsf 白名单
wizardforcel
2016-02-11 13:41:19 +08:00
还是白名单吧。 html5 又新加进来一大堆事件。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/256032

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX