V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
hxsf
V2EX  ›  问与答

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

  •  
  •   hxsf · 2016-02-10 23:19:20 +08:00 · 3398 次点击
    这是一个创建于 3244 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景

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

    • 前台用户写 markdown ,能前台预览(这步是放前端做的)
    • 存储后 markdown 文本入库,
    • 访问时从库里读 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

    14 条回复    2016-02-11 13:41:19 +08:00
    virusdefender
        1
    virusdefender  
       2016-02-10 23:22:28 +08:00
    前端生成的时候我觉得不需要过滤,因为这是 self xss ,不影响别人。

    后端过滤的时候讲 ``` 里面的全部转义,外面的过滤标签和属性。
    skydiver
        2
    skydiver  
       2016-02-10 23:27:23 +08:00 via iPad
    @virusdefender 怎么会不影响别人?写的人和看的人不一定是一个人吧
    virusdefender
        3
    virusdefender  
       2016-02-10 23:33:18 +08:00
    @skydiver 你说的就是可以多人编辑的,我理解错了。那前端预览和后端渲染的时候都过滤 html 就好了。
    techmoe
        5
    techmoe  
       2016-02-10 23:35:25 +08:00 via Android
    后端过滤相应 html 标签呗
    chemzqm
        6
    chemzqm  
       2016-02-11 00:31:42 +08:00
    简单点,除了代码块里面的标签都过滤掉
    ericls
        7
    ericls  
       2016-02-11 03:25:45 +08:00 via iPhone
    标签白名单
    14ly
        8
    14ly  
       2016-02-11 03:28:49 +08:00 via iPhone
    把 dom 弄出来,内容用 innerText 搞
    Andy1999
        9
    Andy1999  
       2016-02-11 04:50:56 +08:00 via iPhone
    简单点 不允许 html 标签
    hxsf
        10
    hxsf  
    OP
       2016-02-11 09:14:35 +08:00 via Android
    @virusdefender
    @techmoe
    @chemzqm
    @ericls
    @14ly
    @Andy1999
    那如何防止 onclick 这种
    virusdefender
        11
    virusdefender  
       2016-02-11 10:11:12 +08:00
    @hxsf 看我上面发的链接
    zsx
        12
    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
        13
    ericls  
       2016-02-11 13:35:46 +08:00 via iPhone
    @hxsf 白名单
    wizardforcel
        14
    wizardforcel  
       2016-02-11 13:41:19 +08:00 via Android
    还是白名单吧。 html5 又新加进来一大堆事件。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2736 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:00 · PVG 20:00 · LAX 04:00 · JFK 07:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.