关于 Pagedown 的安全

2014-06-10 05:19:40 +08:00
 Livid
如果 V2EX 要部署像 Pagedown 这样的基于 JavaScript 的 Markdown 解析库,在安全方面有什么需要特别注意的么?还请有经验的同学能够分享一下吧,谢谢。

https://code.google.com/p/pagedown/wiki/PageDown
6094 次点击
所在节点    Markdown
17 条回复
akfish
2014-06-10 07:24:39 +08:00
Markdown终于要来了?
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
2014-06-10 08:29:34 +08:00
赞一个,cnodejs.org似乎可以作为一个参考,它好像是在服务端做的处理。
解析时确实过滤掉一些危险的标签
jedyu
2014-06-10 08:34:36 +08:00
只用过marked ,收藏看大神解答
Akiyori
2014-06-10 08:49:22 +08:00
Actrace
2014-06-10 11:05:31 +08:00
markdown,我感觉没啥太大作用.
难道真的要把这个地方变成代码库?
joyqi
2014-06-10 11:44:00 +08:00
首先pagedown完全没有对安全性做任何处理,它设计出来就是给前端自己写markdown时来preview的,没有人会无聊到自己xss自己吧。

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

https://gist.github.com/jakwings/a387e11cc27b022e6be2
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
2014-06-10 14:54:03 +08:00
@zhangxiao 你这个方案更复杂啊,体验也不一定好。
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
2014-06-10 16:44:07 +08:00
用标签白名单就好了
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
2014-06-10 20:35:50 +08:00
@akfish 对对,Sanitizer可以处理,我把这个给漏掉了。用的时候没有加Sanitizer,以为它只是用来做标签关闭的。没认真看它代码,抱歉

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

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

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

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

© 2021 V2EX