若依Plus 的XSSFilter 的bug

现象

当我A字段输入 '【】、=-·!@#~¥%......&*()------+{}|":》?《,./;'\][=-`~!@#$%^&*()_+{}|":>????????????????<

B字段输入'【】、=-·!@#~¥%......&*()------+{}|":》?《,./;'\][=-`~!@#$%^&*()_+{}|":>????????????????/>

发现A字段被截断,B字段为空

原因

原因在于XSSFilter中对PUT和POST请求XSS过滤,重新包装了请求头,防止XML攻击,

弊端在于,他传入的content是整段json,也就是A字段和B字段合并起来产生了HTML匹配,所以修改方案是,单个字段校验

java 复制代码
   public static String cleanHtmlTag(String content) {
        return content.replaceAll("(<[^<]*?>)|(<[\\s]*?/[^<]*?>)|(<[^<]*?/[\\s]*?>)", "");
    }

原XssHttpServletRequestWrapper过滤器的getInputStream

java 复制代码
    @Override
    public ServletInputStream getInputStream() throws IOException {
        // 非json类型,直接返回
        if (!isJsonRequest()) {
            return super.getInputStream();
        }

        // 为空,直接返回
        String json = StrUtil.str(IoUtil.readBytes(super.getInputStream(), false), StandardCharsets.UTF_8);
        if (StringUtils.isEmpty(json)) {
            return super.getInputStream();
        }

        // xss过滤
        json = HtmlUtil.cleanHtmlTag(json).trim();
        byte[] jsonBytes = json.getBytes(StandardCharsets.UTF_8);
        final ByteArrayInputStream bis = IoUtil.toStream(jsonBytes);
        return new ServletInputStream() {
            @Override
            public boolean isFinished() {
                return true;
            }

            @Override
            public boolean isReady() {
                return true;
            }

            @Override
            public int available() throws IOException {
                return jsonBytes.length;
            }

            @Override
            public void setReadListener(ReadListener readListener) {
            }

            @Override
            public int read() throws IOException {
                return bis.read();
            }
        };
    }

修改后的

java 复制代码
 @Override
    public ServletInputStream getInputStream() throws IOException {
        // 非 JSON 类型,直接返回
        if (!isJsonRequest()) {
            return super.getInputStream();
        }

        // 读取原始 JSON
        String json = StrUtil.str(IoUtil.readBytes(super.getInputStream(), false), StandardCharsets.UTF_8);
        if (StringUtils.isEmpty(json)) {
            return super.getInputStream();
        }

        // ===== 新逻辑:针对 JSON 的每个 value 做 XSS 清理 =====
        ObjectMapper mapper = new ObjectMapper();
        Map<String, Object> map;
        try {
            map = mapper.readValue(json, new TypeReference<Map<String, Object>>() {});
        } catch (Exception e) {
            // JSON 解析失败,保守返回原始流
            return super.getInputStream();
        }

        // 遍历 Map,把每个 String 类型的 value 做清理
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            if (entry.getValue() instanceof String) {
                entry.setValue(HtmlUtil.cleanHtmlTag((String) entry.getValue()).trim());
            }
        }

        // 序列化回 JSON
        byte[] jsonBytes = mapper.writeValueAsBytes(map);
        final ByteArrayInputStream bis = new ByteArrayInputStream(jsonBytes);

        // 返回新的 ServletInputStream
        return new ServletInputStream() {
            @Override
            public boolean isFinished() {
                return true;
            }

            @Override
            public boolean isReady() {
                return true;
            }

            @Override
            public void setReadListener(ReadListener readListener) {}

            @Override
            public int available() throws IOException {
                return jsonBytes.length;
            }

            @Override
            public int read() throws IOException {
                return bis.read();
            }
        };
    }
相关推荐
139的世界真奇妙17 小时前
生产问题排查记录
golang·bug·学习方法
oioihoii17 小时前
我的第一次移动端 AI 办公:在地铁上把 Bug 修了
人工智能·bug
Coder_Shenshen17 小时前
【基于LibUA库的OPC UA服务器与客户端Demo——协议解析与Bug修复实践】
网络·c#·bug
Pan Zonghui3 天前
GitHub Bug反馈与修复全流程指南
github·bug
初圣魔门首席弟子4 天前
bug 2026.05.15(以前能运行的java springboot项目突然间不能运行后台数据了)
java·开发语言·bug
Desenberg4 天前
【Claude Code】因为中途修改配置路径导致Claude Code 插件安装失败
windows·bug
QuestLab5 天前
维护 Hermes Agent CN 过程中的碎碎念,以及从bug上得到的一点点启发
bug
java修仙传5 天前
Java 实习日记:一次 Excel 导入校验 Bug 的定位与数据更新逻辑优化
java·数据库·bug·excel·后端开发
当战神遇到编程5 天前
软件测试基础入门:从 BUG 到测试用例设计完整指南
测试用例·bug
Bear on Toilet7 天前
3. BUG篇
bug