昨天阿里安全实习生面试问到了这个,感觉回答的不是很好,最后挂了,今天总结一下。
富文本安全主要分为文件上传防御和xss过滤。
文件上传主要是用来防御上传webshell。只要文件上传到不会被解析的目录里面去就没有太大问题了,但是记住是所有的文件,不要看到是图片等静态文件就可以随便存放了,因为一般后端检测文件类型都是通过拓展名或者文件头进行的,很容易绕过的。
同时上传的文件最好使用和主域名隔离的域名,比如部分网站设置了csp头,只运行本域名下js,但是文件上传的时候可以直接上传到本域名下任意js,导致csp失效。
xss过滤是最重要的,也是最难搞的。面试的时候那人问我怎么过滤,我就说过滤危险的标签和属性,但是他却说我有很多的办法啊能绕过的,我今天才反应过来,应该是我没有说清楚,我不是直接通过字符串匹配过滤的啊,而是先解析dom,然后过滤的啊~~
具体过滤的时候一般使用白名单
- 解析html,得到所有的html标签和属性。对于不在白名单中的标签,直接删除或者转义。属性值里面的特殊字符要进行转义,防止跃出。比如
<img width="100">
如果我修改100
为100" onerror=alert(1)"
就变成了<img width="100" onerror=alert(1)"">
了。 - 对于部分引入外链的属性,如src,href等判断链接是否合法,过滤
<a href=javascript:alert(1)>
的情况,而且最好是只能使用指定域名下的外链。 - 嵌入falsh的embed标签设置
allowscriptaccess=never
,allownetworking=none
allowScriptAccess用来控制flash与html的通讯,可选的值为:
always //对与html的通讯也就是执行javascript不做任何限制
sameDomain //只允许来自于本域的flash与html通讯,这是默认值
never //绝对禁止flash与页面的通讯
allowNetworking //用来控制flash与外部的网络通讯,可选的值为:
all //允许使用所有的网络通讯,也是默认值
internal //flash不能与浏览器通讯如navigateToURL,但是可以调用其他的API
none //禁止任何的网络通讯
这里有一个python的富文本过滤器,基本思路和上面的一样,但是实现的还是有些太简单粗暴,比如富文本时候很多地方都会用到style属性,如果允许这个属性,那就可能通过expression等进行xss,还需要更加细致的去过滤。
参考 http://security.tencent.com/index.php/blog/msg/53
http://barretlee.com/blog/2014/05/xss-snippts.html