xss库过滤后内容变空白是怎么回事?

Mr-熙然 阅读 8

我用 xss 库对用户输入做过滤,但有些内容直接变成空字符串了,比如输入 alert(1) 确实该被清掉,但像 test 这种,为啥连 “test” 都没了?

我试过默认配置和自定义白名单,还是不行。代码是这样:

const clean = xss('<img src="a" onerror="alert(1)">test');
console.log(clean); // 输出居然是空字符串!
我来解答 赞 4 收藏
二维码
手机扫码查看
1 条解答
司马欣怡
这个问题挺诡异的,默认情况下 xss 库不应该把 "test" 也给你清掉。

你先打印一下原始输入看看:

const input = '<img src="a" onerror="alert(1)">test';
console.log('原始输入:', input);
console.log('输入长度:', input.length);


我怀疑你输入的字符串本身可能有问题。你代码里写的是 xss('test'),但看问题详情你贴的是 xss(''<img src="a" onerror="alert(1)">test''),这可是 HTML 实体编码后的内容啊。

如果是实体编码的情况,xss 库会把它当普通文本处理,不会做过滤,最后输出应该和输入一样。你试试直接输出那个带 < 的字符串,看看是不是本来就长这样。

如果排除编码问题,那就检查一下你的 xss 配置:

const xss = require('xss');
const clean = new xss.FilterXSS({
whiteList: {}, // 你是不是设了空白名单?
stripIgnoreTag: true,
stripIgnoreTagBody: ['script']
});

console.log(clean.process('<img src="a" onerror="alert(1)">test'));


你配置里是不是把 whiteList 设成空对象了?那所有标签都会被干掉的。

另外还有一种情况:有些版本或者用法下,如果整个字符串被识别为危险内容,可能会返回空串。你可以先试试不过滤直接输出原字符串,确认问题到底出在哪一步。
点赞
2026-03-18 15:25