package com.iailab.framework.xss.config; import com.iailab.framework.common.enums.WebFilterOrderEnum; import com.iailab.framework.xss.core.clean.JsoupXssCleaner; import com.iailab.framework.xss.core.clean.XssCleaner; import com.iailab.framework.xss.core.filter.XssFilter; import com.iailab.framework.xss.core.json.XssStringJsonDeserializer; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.util.PathMatcher; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import static com.iailab.framework.web.config.IailabWebAutoConfiguration.createFilterBean; @AutoConfiguration @EnableConfigurationProperties(XssProperties.class) @ConditionalOnProperty(prefix = "iailab.xss", name = "enable", havingValue = "true", matchIfMissing = true) // 设置为 false 时,禁用 public class IailabXssAutoConfiguration implements WebMvcConfigurer { /** * Xss 清理者 * * @return XssCleaner */ @Bean @ConditionalOnMissingBean(XssCleaner.class) public XssCleaner xssCleaner() { return new JsoupXssCleaner(); } /** * 注册 Jackson 的序列化器,用于处理 json 类型参数的 xss 过滤 * * @return Jackson2ObjectMapperBuilderCustomizer */ @Bean @ConditionalOnMissingBean(name = "xssJacksonCustomizer") @ConditionalOnBean(ObjectMapper.class) @ConditionalOnProperty(value = "iailab.xss.enable", havingValue = "true") public Jackson2ObjectMapperBuilderCustomizer xssJacksonCustomizer(XssProperties properties, PathMatcher pathMatcher, XssCleaner xssCleaner) { // 在反序列化时进行 xss 过滤,可以替换使用 XssStringJsonSerializer,在序列化时进行处理 return builder -> builder.deserializerByType(String.class, new XssStringJsonDeserializer(properties, pathMatcher, xssCleaner)); } /** * 创建 XssFilter Bean,解决 Xss 安全问题 */ @Bean @ConditionalOnBean(XssCleaner.class) public FilterRegistrationBean xssFilter(XssProperties properties, PathMatcher pathMatcher, XssCleaner xssCleaner) { return createFilterBean(new XssFilter(properties, pathMatcher, xssCleaner), WebFilterOrderEnum.XSS_FILTER); } }