防止XSS攻击(输出过滤)

592 阅读1分钟

一个新项目, 项目里有富文本编辑器, 有编辑就要有显示, 显示用的v-html, 本着简单发布第一版的原则, 看着没什么问题就准备上线。 然而, 安全组同事竟然报了个xss漏洞, 然后顺便给出了修复方法:输入过滤/输出过滤, 我一看, 那必须输出过滤呀这个改着最方便(当然, 对于富文本编辑器, 我不想过于限制用户的输入, 毕竟面向领导编程, 而他不喜欢限制)。 然后安全组同事还友好的推荐了xss-filters。那当然就屁颠屁颠的使用了这个方案啦。

然而刚改完这个, 测试就提了bug, 页面多了标签的展示, 类似这样

<p>内容</p>

这还得了, xss-filters把标签尖括号都转义了, 富文本还富个毛线呀, 于是, 只能换方式了, 幸亏搜到个jsxss的库, 也是标签转义, 不过它貌似不转义所有的标签, 还能保留原本的标签, 就它了。

然而事情远没有我想象的简单, 有些设置了样式的span元素, style会被整个移除, 查看了使用说明, 准备用白名单xss.whiteListspan加上style属性, 但是一看默认列表, 这么多, 我要每个标签后面给它加style属性, 果断不要, 换一种方法, 只添加style的方式。 还好有个onIgnoreTagAttr方法, 把需要的style加上去, OK啦。

xss(html, {
    onIgnoreTagAttr: (_tag, name, value, _isWhiteAttr) => {
        return name === 'style' ? `${name}="${value}"` : undefined
    },
})

最后, 附上xss-filtersjsxss的区别, 以后可以挑选合适的库来用。

两个xss过滤库的区别.png 感觉有些不完整, 后面再继续补充完善(可能吧7208e79a-58f7-4ab6-b14b-b181be799726.png