xss库过滤后内容变空白是怎么回事? Mr-熙然 提问于 2026-03-18 14:13:19 阅读 96 安全 我用 xss 库对用户输入做过滤,但有些内容直接变成空字符串了,比如输入 alert(1) 确实该被清掉,但像 test 这种,为啥连 “test” 都没了? 我试过默认配置和自定义白名单,还是不行。代码是这样: const clean = xss('<img src="a" onerror="alert(1)">test'); console.log(clean); // 输出居然是空字符串! XSS防护前端安全 我来解答 赞 14 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 2 条解答 令狐怡萱 Lv1 这个问题听起来挺头疼的。xss 库的默认行为有时候确实会让人摸不着头脑。咱们一步一步来排查一下。 首先,xss 库在处理 HTML 内容时,默认情况下会移除所有它认为可能存在安全风险的标签和属性。这包括像 onerror 这样的事件处理器,因为你提到的 alert(1) 显然是一个 XSS 攻击的例子。 但是,test 变为空字符串可能是因为默认的解析器在处理 标签的时候,发现这个标签不合法或者不完整(因为它没有闭合标签),所以它可能把整个 标签及其后面的内容都忽略了。 解决这个问题的方法之一是确保你的 HTML 输入是有效的,不过有时候这是不可能控制的,特别是当用户输入的时候。另一个方法是调整 xss 库的配置,让它更宽松一些,允许通过我们信任的内容。 下面我给你一个自定义配置的例子,让 xss 库能够通过 test 这样的纯文本内容: const xss = require('xss'); // 自定义白名单,允许 img 标签,但是移除 onerror 属性 const myXssFilter = new xss.FilterXSS({ whiteList: { img: ['src'] // 只允许 src 属性 } }); const input = 'test'; const clean = myXssFilter.process(input); console.log(clean); // 应该输出: test 这里我们创建了一个新的 FilterXSS 实例,并且定义了一个 whiteList,只允许 img 标签并且只保留它的 src 属性。这样就不会移除 test 了。 原理是这样:通过自定义白名单,我们可以告诉 xss 库哪些标签和属性是可以信任的,哪些应该被移除。这样既可以保护我们的应用不受 XSS 攻击,又能保留我们想要的内容。 希望这能解决你的问题。有时候处理这种库的行为确实挺费劲的,但是一旦搞定了,心里还是会挺有成就感的。 回复 点赞 2026-03-23 23:02 司马欣怡 Lv1 这个问题挺诡异的,默认情况下 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 加载更多 相关推荐 2 回答 41 浏览 xss库过滤后内容显示异常怎么办? 我用 xss 库对用户输入做了过滤,但有些正常内容也被转义了,比如 <div> 这种标签直接显示成文本了,不是渲染成 HTML。是不是我用法不对? 我是这样用的: import { san... Good“洛熙 安全 2026-03-05 16:23:18 2 回答 84 浏览 前端做XSS输入过滤到底该在哪儿处理? 我最近在用 Vue 写一个评论功能,用户输入的内容会直接渲染到页面上。我知道要防 XSS,但不确定是在输入时就过滤掉危险字符,还是在渲染时转义?试过在提交前用正则替换 script 标签,但好像还是能... Code°秀云 安全 2026-03-19 08:44:24 1 回答 61 浏览 前端怎么防范XSS攻击?我用了DOMPurify还是被绕过了? 我在项目里引入了 DOMPurify 来过滤用户输入,但安全测试时还是报了 XSS 漏洞。比如用户提交的内容里有 <img src=x onerror=alert(1)>,明明应该被过滤掉... 技术若溪 安全 2026-03-09 19:29:21 2 回答 77 浏览 安全需求文档该怎么写才能防XSS漏洞? 我们在做用户评论功能时,测试发现XSS漏洞,但安全需求文档里只写了“过滤危险字符”,具体该怎么做才能有效防范呢? 之前尝试用正则表达式过滤了<script>标签和特殊字符,但测试人员用Un... UX-彩云 安全 2026-01-29 21:23:26 2 回答 72 浏览 设置了X-XSS-Protection后CSS样式被过滤导致页面错乱怎么办? 我在开发页面时启用了X-XSS-Protection: 1; mode=block头,但发现动态生成的用户提交内容里的CSS样式被过滤了。比如用户输入的标签带内联样式时,浏览器直接移除了style属性... 程序员亚美 安全 2026-01-29 16:50:32 1 回答 81 浏览 AppScan 扫出 Vue 项目 XSS 漏洞怎么修复? 最近用 AppScan 扫我们 Vue 项目,报了个反射型 XSS 高危漏洞,说是在路由参数没过滤。但我明明用的是 Vue Router,参数都是通过 this.$route.query 拿的,页面上... 司徒子聪 安全 2026-03-30 11:34:17 1 回答 38 浏览 富文本编辑器怎么防XSS攻击? 我在项目里用了富文本编辑器,用户可以贴各种HTML内容,但担心被XSS注入。试过用DOMPurify.sanitize()处理,但有些样式会被干掉,客户不接受。 有没有既能保留合理标签(比如<b... シ紫瑶 安全 2026-03-26 16:30:26 2 回答 42 浏览 前端输入过滤真能防XSS吗?我这样写安全吗? 我在React项目里做用户评论功能,担心XSS攻击,就对输入做了个简单过滤,但不确定这样够不够。比如把script标签替换成空字符串,但听说还有其他绕过方式? 下面是我现在的处理代码: const s... 开发者玉聪 安全 2026-03-25 11:41:19 2 回答 61 浏览 前端代码里怎么防止XSS攻击?我这样写安全吗? 最近在做渗透测试,发现我们项目里有个用户输入展示的地方可能有XSS风险。我用React直接渲染用户输入的内容,但听说这样不安全,可又不确定具体哪里有问题。 我试过用DOMPurify处理,但团队有人说... Des.统思 安全 2026-03-22 11:11:22 2 回答 72 浏览 React里设置了X-XSS-Protection头页面却变空白了? 最近在给React项目加固安全配置,按教程加了X-XSS-Protection头,结果页面直接变空白了。明明后端已经设置过响应头,为什么前端代码里再配置就会出问题? 我尝试在App.js里这样写: f... 司马卫红 安全 2026-02-12 23:55:23
首先,xss 库在处理 HTML 内容时,默认情况下会移除所有它认为可能存在安全风险的标签和属性。这包括像
onerror这样的事件处理器,因为你提到的alert(1)显然是一个 XSS 攻击的例子。但是,
test变为空字符串可能是因为默认的解析器在处理![]()
标签的时候,发现这个标签不合法或者不完整(因为它没有闭合标签),所以它可能把整个![]()
标签及其后面的内容都忽略了。解决这个问题的方法之一是确保你的 HTML 输入是有效的,不过有时候这是不可能控制的,特别是当用户输入的时候。另一个方法是调整 xss 库的配置,让它更宽松一些,允许通过我们信任的内容。
下面我给你一个自定义配置的例子,让 xss 库能够通过
test这样的纯文本内容:这里我们创建了一个新的
FilterXSS实例,并且定义了一个whiteList,只允许img标签并且只保留它的src属性。这样就不会移除test了。原理是这样:通过自定义白名单,我们可以告诉 xss 库哪些标签和属性是可以信任的,哪些应该被移除。这样既可以保护我们的应用不受 XSS 攻击,又能保留我们想要的内容。
希望这能解决你的问题。有时候处理这种库的行为确实挺费劲的,但是一旦搞定了,心里还是会挺有成就感的。
你先打印一下原始输入看看:
我怀疑你输入的字符串本身可能有问题。你代码里写的是
xss('
test'),但看问题详情你贴的是xss(''<img src="a" onerror="alert(1)">test''),这可是 HTML 实体编码后的内容啊。如果是实体编码的情况,xss 库会把它当普通文本处理,不会做过滤,最后输出应该和输入一样。你试试直接输出那个带
<的字符串,看看是不是本来就长这样。如果排除编码问题,那就检查一下你的 xss 配置:
你配置里是不是把 whiteList 设成空对象了?那所有标签都会被干掉的。
另外还有一种情况:有些版本或者用法下,如果整个字符串被识别为危险内容,可能会返回空串。你可以先试试不过滤直接输出原字符串,确认问题到底出在哪一步。