栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Springboot实现XSS漏洞过滤的示例代码

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Springboot实现XSS漏洞过滤的示例代码

背景

前阵子做了几个项目,终于开发完毕,进入了测试阶段,信心满满将项目部署到测试环境,然后做了安全测评之后.....

​(什么!你竟然说我代码不安全???)

然后测出了 Xss漏洞 安全的问题

解决方案

场景:可以在页面输入框输入JS脚本, 攻击者可以利用此漏洞执行恶意的代码

问题演示

所以我们要对于前端传输的参数做处理,做统一全局过滤处理

既然要过滤处理,我们首先需要实现一个自定义过滤器

总共包含以下四部分

  • XssUtil
  • XssFilterAutoConfig
  • XssHttpServletRequestWrapper
  • XssStringfJsonDeserializer

最后我们需要在全局过滤器中使用我们实现的Xss自定义过滤器

代码实现

XssFilterAtuoConfig实现代码

 import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import net.greatsoft.overallbudget.filter.SimpleCORSFilter;
import org.springframework.boot.context.embedded.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;


@Configuration
public class XssFilterAtuoConfig {

  
  @Bean
  public FilterRegistrationBean xssFiltrRegister() {
    FilterRegistrationBean registration = new FilterRegistrationBean();
    //设置系统过滤器 (setFilter就是你所定义的过滤器filter类)
    registration.setFilter(new SimpleCORSFilter());
    //过滤所有路径
    registration.addUrlPatterns("
  @Bean
  @Primary
  public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
    SimpleModule module = new SimpleModule();
    //自定义序列化过滤配置(XssStringJsonDeserializer), 对入参进行转译
    module.addDeserializer(String.class, new XssStringJsonDeserializer());
    // 注册解析器
    ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().build();
    objectMapper.registerModule(module);
    return new MappingJackson2HttpMessageConverter(objectMapper);
  }
}

XssHttpServletRequestWrapper实现代码


public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {

  public XssHttpServletRequestWrapper(HttpServletRequest request) {
    super(request);
  }

  
  @Override
  public String getHeader(String name) {
    String value = super.getHeader(name);
    return XssUtil.cleanXSS(value);
  }

  
  @Override
  public String getParameter(String name) {
    String value = super.getParameter(name);
    return XssUtil.cleanXSS(value);
  }

  
  @Override
  public String[] getParameterValues(String name) {
    String[] values = super.getParameterValues(name);
    if (values != null) {
      int length = values.length;
      String[] escapsevalues = new String[length];
      for (int i = 0; i < length; i++) {
 escapsevalues[i] = XssUtil.cleanXSS(values[i]);
      }
      return escapsevalues;
    }
    return super.getParameterValues(name);
  }

  
  @Override
  public Object getAttribute(String name) {
    // 获取pathvalue的值
    if (HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE.equals(name)) {
      Map uriTemplateVars = (Map) super.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
      if (Objects.isNull(uriTemplateVars)) {
 return uriTemplateVars;
      }
      Map newMap = new linkedHashMap<>();
      uriTemplateVars.forEach((key, value) -> {
 if (value instanceof String) {
   newMap.put(key, XssUtil.cleanXSS((String) value));
 } else {
   newMap.put(key, value);

 }
      });
      return newMap;
    } else {
      return super.getAttribute(name);
    }
  }
} 

XssStringJsonDeserializer代码实现

 
public class XssStringJsonDeserializer extends JsonDeserializer {


  @Override
  public Class handledType() {
    return String.class;
  }

  @Override
  public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
    return XssUtil.cleanXSS(jsonParser.getValueAsString());
  }
} 

XssUtil代码实现

 
public class XssUtil {

  public static String cleanXSS(String value) {
    if (Objects.isNull(value)) {
      return value;
    }
    //在这里自定义需要过滤的字符
    value = value.replaceAll("<", "& lt;").replaceAll(">", "& gt;");
    value = value.replaceAll("(", "& #40;").replaceAll(")", "& #41;");
    value = value.replaceAll("'", "& #39;");
    value = value.replaceAll("eval((.*))", "");
    value = value.replaceAll("["'][s]*javascript:(.*)["']", """");
    value = value.replaceAll("