关于 Pagedown 的安全 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Livid
180.99D
594.19D
V2EX    Markdown

关于 Pagedown 的安全

  •  
  •   Livid
    PRO
    2014-06-10 05:19:40 +08:00 6424 次点击
    这是一个创建于 4205 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如果 V2EX 要部署像 Pagedown 这样的基于 Javascript 的 Markdown 解析库,在安全方面有什么需要特别注意的么?还请有经验的同学能够分享一下吧,谢谢。

    https://code.google.com/p/pagedown/wiki/PageDown
    17 条回复    2014-06-10 20:35:50 +08:00
    akfish
        1
    akfish  
       2014-06-10 07:24:39 +08:00
    Markdown终于要来了?
    akfish
        2
    akfish  
       2014-06-10 07:37:36 +08:00
    Pagedown没用过,但Markdown的库一般都有sanitize的选项,会把一些HTML Tag按白名单过滤,避免XSS攻击。
    大概看了下Pagedown sanitizer的实现
    https://code.google.com/p/pagedown/source/browse/Markdown.Sanitizer.js
    按文档说明用一般不会有什么安全性问题
    https://code.google.com/p/pagedown/wiki/PageDown#Markdown.Sanitizer.js
    WildCat
        3
    WildCat  
       2014-06-10 08:29:34 08:00 via iPhone
    赞一个,cnodejs.org似乎可以作为一个参考,它好像是在服务端做的处理。
    解析时确实过滤掉一些危险的标签
    jedyu
        4
    jedyu  
       2014-06-10 08:34:36 +08:00
    只用过marked ,收藏看大神解答
    Actrace
        6
    Actrace  
       2014-06-10 11:05:31 +08:00
    markdown,我感觉没啥太大作用.
    难道真的要把这个地方变成代码库?
    joyqi
        7
    joyqi  
       2014-06-10 11:44:00 +08:00   3
    首先pagedown完全没有对安全性做任何处理,它设计出来就是给前端自己写markdown时来preview的,没有人会无聊到自己xss自己吧。

    但如果你要信赖它解析后的代码,并展现给所有人就会有很大的问题了。而且它还支持直接输入html代码,所以我的建议是在输出之前,用dom库载入它,把所有的元素撸一遍,去掉非法标签,比如script之类,去掉非法的属性比如onclick之类的。
    chemzqm
        8
    chemzqm  
       2014-06-10 12:19:18 +08:00
    简单做法就是后端过滤掉所有的html标签,干脆不支持html
    lm902
        9
    lm902  
       2014-06-10 13:16:52 +08:00
    a href=Javascript:这个也要去掉,还有form action=Javascript:...
    soli
        10
    soli  
       2014-06-10 13:42:35 +08:00
    Markdown 终于要来了。。。
    jakwings
        11
    jakwings  
       2014-06-10 14:19:28 +08:00
    假如可以在渲染模块中直接修改的话,我会这么过滤href和style属性:

    https://gist.github.com/jakwings/a387e11cc27b022e6be2
        12
    zhangxiao  
       2014-06-10 14:36:30 +08:00
    个人感觉markdown对v2ex来说还是可有可无的。

    有一个比较复杂的办法,让v2支持github login,token里申请create gist的权限。然后用户贴代码的时候,直接去create一个gist,把地址贴回来。需要处理的是需要一个特殊的标签来表示code block。比如

    gist:
    val a = 10
    :gist

    之类的
    fx
        13
    fx  
       2014-06-10 14:54:03 +08:00
    @zhangxiao 你这个方案更复杂啊,体验也不一定好。
    akfish
        14
    akfish  
       2014-06-10 16:38:06 +08:00
    @joyqi No no no. 看源代码,只允许少数标签,你说的问题不存在:
    https://code.google.com/p/pagedown/source/browse/Markdown.Sanitizer.js#23

    基本上就只允许和Markdown功能等效的HTML Tag、链接和图片而已。
    不知道所谓“完全没做处理”是怎么来的。
    ipconfiger
        15
    ipconfiger  
       2014-06-10 16:44:07 +08:00
    用标签白名单就好了
    akfish
        16
    akfish  
       2014-06-10 16:54:49 +08:00
    好吧,看到楼上很多人就没看过文档/代码的样子,总结下吧:

    Pagedown白名单的标签(见代码https://code.google.com/p/pagedown/source/browse/Markdown.Sanitizer.js#23):
    * b|blockquote|code|del|dd|dl|dt|em|h1|h2|h3|i|kbd|li|ol|p|pre|s|sup|sub|strong|strike|ul|br|hr
    * a(只允许有href和title属性,href只允许到http/https/ftp协议以及相对路径)
    * img(只允许src、width、height、title和alt属性,href只允许到http/https/ftp协议以及相对路径)

    Pagedown会尝试对标签进行配对,避免“没关门”的现象(见代码https://code.google.com/p/pagedown/source/browse/Markdown.Sanitizer.js#45)。

    虽然我还是没用过,但我信口开河前还是会看下源代码的。
    joyqi
        17
    joyqi  
       2014-06-10 20:35:50 +08:00
    @akfish 对对,Sanitizer可以处理,我把这个给漏掉了。用的时候没有加Sanitizer,以为它只是用来做标签关闭的。没认真看它代码,抱歉
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2746 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 13:06 PVG 21:06 LAX 05:06 JFK 08:06
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86