一个新项目, 项目里有富文本编辑器, 有编辑就要有显示, 显示用的v-html, 本着简单发布第一版的原则, 看着没什么问题就准备上线。 然而, 安全组同事竟然报了个xss漏洞, 然后顺便给出了修复方法:输入过滤/输出过滤, 我一看, 那必须输出过滤呀这个改着最方便(当然, 对于富文本编辑器, 我不想过于限制用户的输入, 毕竟面向领导编程, 而他不喜欢限制)。 然后安全组同事还友好的推荐了xss-filters。那当然就屁颠屁颠的使用了这个方案啦。
然而刚改完这个, 测试就提了bug, 页面多了标签的展示, 类似这样
<p>内容</p>
这还得了, xss-filters把标签尖括号都转义了, 富文本还富个毛线呀, 于是, 只能换方式了, 幸亏搜到个jsxss的库, 也是标签转义, 不过它貌似不转义所有的标签, 还能保留原本的标签, 就它了。
然而事情远没有我想象的简单, 有些设置了样式的span元素, style会被整个移除, 查看了使用说明, 准备用白名单xss.whiteList给span加上style属性, 但是一看默认列表, 这么多, 我要每个标签后面给它加style属性, 果断不要, 换一种方法, 只添加style的方式。 还好有个onIgnoreTagAttr方法, 把需要的style加上去, OK啦。
xss(html, {
onIgnoreTagAttr: (_tag, name, value, _isWhiteAttr) => {
return name === 'style' ? `${name}="${value}"` : undefined
},
})
最后, 附上xss-filters和jsxss的区别, 以后可以挑选合适的库来用。
感觉有些不完整, 后面再继续补充完善(可能吧
)