Commit c943233ee56d00d74d41a3fa8dbf85626f10cbdd

Authored by YunaiV
1 parent d636391a

bugfix:修复 Xss 开启时,忽略的 URL 针对 RequestBody 还是会 XSS 过滤的问题

yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/xss/config/YudaoXssAutoConfiguration.java
... ... @@ -44,9 +44,11 @@ public class YudaoXssAutoConfiguration implements WebMvcConfigurer {
44 44 @ConditionalOnMissingBean(name = "xssJacksonCustomizer")
45 45 @ConditionalOnBean(ObjectMapper.class)
46 46 @ConditionalOnProperty(value = "yudao.xss.enable", havingValue = "true")
47   - public Jackson2ObjectMapperBuilderCustomizer xssJacksonCustomizer(XssCleaner xssCleaner) {
  47 + public Jackson2ObjectMapperBuilderCustomizer xssJacksonCustomizer(XssProperties properties,
  48 + PathMatcher pathMatcher,
  49 + XssCleaner xssCleaner) {
48 50 // 在反序列化时进行 xss 过滤,可以替换使用 XssStringJsonSerializer,在序列化时进行处理
49   - return builder -> builder.deserializerByType(String.class, new XssStringJsonDeserializer(xssCleaner));
  51 + return builder -> builder.deserializerByType(String.class, new XssStringJsonDeserializer(properties, pathMatcher, xssCleaner));
50 52 }
51 53  
52 54 /**
... ...
yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/xss/core/json/XssStringJsonDeserializer.java
1 1 package cn.iocoder.yudao.framework.xss.core.json;
2 2  
  3 +import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
  4 +import cn.iocoder.yudao.framework.xss.config.XssProperties;
3 5 import cn.iocoder.yudao.framework.xss.core.clean.XssCleaner;
4 6 import com.fasterxml.jackson.core.JsonParser;
5 7 import com.fasterxml.jackson.core.JsonToken;
6 8 import com.fasterxml.jackson.databind.DeserializationContext;
7 9 import com.fasterxml.jackson.databind.deser.std.StringDeserializer;
  10 +import jakarta.servlet.http.HttpServletRequest;
8 11 import lombok.AllArgsConstructor;
9 12 import lombok.extern.slf4j.Slf4j;
  13 +import org.springframework.util.PathMatcher;
10 14  
11 15 import java.io.IOException;
12 16  
... ... @@ -20,10 +24,29 @@ import java.io.IOException;
20 24 @AllArgsConstructor
21 25 public class XssStringJsonDeserializer extends StringDeserializer {
22 26  
  27 + /**
  28 + * 属性
  29 + */
  30 + private final XssProperties properties;
  31 + /**
  32 + * 路径匹配器
  33 + */
  34 + private final PathMatcher pathMatcher;
  35 +
23 36 private final XssCleaner xssCleaner;
24 37  
25 38 @Override
26 39 public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
  40 + // 1. 白名单 URL 的处理
  41 + HttpServletRequest request = ServletUtils.getRequest();
  42 + if (request != null) {
  43 + String uri = ServletUtils.getRequest().getRequestURI();
  44 + if (properties.getExcludeUrls().stream().anyMatch(excludeUrl -> pathMatcher.match(excludeUrl, uri))) {
  45 + return p.getText();
  46 + }
  47 + }
  48 +
  49 + // 2. 真正使用 xssCleaner 进行过滤
27 50 if (p.hasToken(JsonToken.VALUE_STRING)) {
28 51 return xssCleaner.clean(p.getText());
29 52 }
... ...