JSP spring boot / cloud 使用filter防止XSS

发布时间 - 2026-01-11 01:38:54    点击率:

JSP spring boot / cloud 使用filter防止XSS

一.前言

XSS(跨站脚本攻击)

跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

二.思路

基于filter拦截,将特殊字符替换为html转意字符 (如: "<" 转意为 "&lt;") , 需要拦截的点如下:

  • 请求头 requestHeader
  • 请求体 requestBody
  • 请求参数 requestParameter

三.实现

1.创建XssHttpServletRequestWrapper类

在获取请求头,请求参数的这些地方,将目标值使用HtmlUtils.htmlEscape方法转意为html字符,而避免恶意代码参与到后续的流程中

/**
 * XssHttpServletRequestWrapper.java
 * Created at 2016-09-19
 * Created by wangkang
 * Copyright (C) 2016 egridcloud.com, All rights reserved.
 */
package com.egridcloud.udf.core.xss;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

import org.springframework.web.util.HtmlUtils;

/**
 * 描述 : 跨站请求防范
 *
 * @author wangkang
 *
 */
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {

 /**
  * 描述 : 构造函数
  *
  * @param request 请求对象
  */
 public XssHttpServletRequestWrapper(HttpServletRequest request) {
  super(request);
 }

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

 @Override
 public String getParameter(String name) {
  String value = super.getParameter(name);
  return HtmlUtils.htmlEscape(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] = HtmlUtils.htmlEscape(values[i]);
   }
   return escapseValues;
  }
  return super.getParameterValues(name);
 }

}

2.创建XssStringJsonSerializer类

其次是涉及到json转换的地方,也一样需要进行转意,比如,rerquestBody,responseBody

/**
 * XssStringJsonSerializer.java
 * Created at 2016-09-19
 * Created by wangkang
 * Copyright (C) 2016 egridcloud.com, All rights reserved.
 */
package com.egridcloud.udf.core.xss;

import java.io.IOException;

import org.springframework.web.util.HtmlUtils;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

/**
 * 描述 : 基于xss的JsonSerializer
 *
 * @author wangkang
 *
 */
public class XssStringJsonSerializer extends JsonSerializer<String> {

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

 @Override
 public void serialize(String value, JsonGenerator jsonGenerator,
   SerializerProvider serializerProvider) throws IOException {
  if (value != null) {
   String encodedValue = HtmlUtils.htmlEscape(value);
   jsonGenerator.writeString(encodedValue);
  }
 }

}

3.创建Bean

在启动类中,创建XssObjectMapper的bean,替换spring boot原有的实例,用于整个系统的json转换.

 /**
  * 描述 : xssObjectMapper
  *
  * @param builder builder
  * @return xssObjectMapper
  */
 @Bean
 @Primary
 public ObjectMapper xssObjectMapper(Jackson2ObjectMapperBuilder builder) {
  //解析器
  ObjectMapper objectMapper = builder.createXmlMapper(false).build();
  //注册xss解析器
  SimpleModule xssModule = new SimpleModule("XssStringJsonSerializer");
  xssModule.addSerializer(new XssStringJsonSerializer());
  objectMapper.registerModule(xssModule);
  //返回
  return objectMapper;
 }

4.创建XssFilter

首先是拦截所有的请求,然后在doFilter方法中,将HttpServletRequest强制类型转换成XssHttpServletRequestWrapper

然后传递下去.

/**
 * XssFilter.java
 * Created at 2016-09-19
 * Created by wangkang
 * Copyright (C) 2016 egridcloud.com, All rights reserved.
 */
package com.egridcloud.udf.core.xss;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 描述 : 跨站请求防范
 *
 * @author wangkang
 *
 */
@WebFilter(filterName = "xssFilter", urlPatterns = "/*", asyncSupported = true)
public class XssFilter implements Filter {

 /**
  * 描述 : 日志
  */
 private static final Logger LOGGER = LoggerFactory.getLogger(XssFilter.class);

 @Override
 public void init(FilterConfig filterConfig) throws ServletException {
  LOGGER.debug("(XssFilter) initialize");
 }

 @Override
 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
   throws IOException, ServletException {
  XssHttpServletRequestWrapper xssRequest =
    new XssHttpServletRequestWrapper((HttpServletRequest) request);
  chain.doFilter(xssRequest, response);
 }

 @Override
 public void destroy() {
  LOGGER.debug("(XssFilter) destroy");
 }

}

四.结束

本文虽基于spring boot实现主题,但是思路是一致的,不限于任何框架.

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# JSP  # spring  # boot  # 使用filter防止XSS  # 简单了解Spring Boot及idea整合jsp过程解析  # SpringBoot+jsp项目启动出现404的解决方法  # spring boot整合jsp及设置启动页面的方法  # 详解SpringBoot 添加对JSP的支持(附常见坑点)  # SpringBoot项目如何访问jsp页面的示例代码  # 详解SpringBoot集成jsp(附源码)+遇到的坑  # Springboot使用jsp具体案例解析  # 意为  # 之时  # 希望能  # 涉及到  # 谢谢大家  # 转换成  # 该页  # 恶意代码  # 类中  # 样式表  # 特殊字符  # core  # xss  # udf  # getParameterValues  # servlet  # http  # import  # javax  # values 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 香港服务器网站生成指南:免费资源整合与高速稳定配置方案  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  Laravel如何为API生成Swagger或OpenAPI文档  浅谈javascript alert和confirm的美化  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  实例解析angularjs的filter过滤器  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  原生JS实现图片轮播切换效果  专业商城网站制作公司有哪些,pi商城官网是哪个?  手机软键盘弹出时影响布局的解决方法  如何在阿里云香港服务器快速搭建网站?  详解阿里云nginx服务器多站点的配置  网站建设保证美观性,需要考虑的几点问题!  图册素材网站设计制作软件,图册的导出方式有几种?  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  Laravel如何使用.env文件管理环境变量?(最佳实践)  Laravel distinct去重查询_Laravel Eloquent去重方法  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  如何用wdcp快速搭建高效网站?  如何快速生成专业多端适配建站电话?  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  网站制作大概多少钱一个,做一个平台网站大概多少钱?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  利用vue写todolist单页应用  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  如何在阿里云虚拟服务器快速搭建网站?  潮流网站制作头像软件下载,适合母子的网名有哪些?  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  如何在阿里云部署织梦网站?  Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】  Python函数文档自动校验_规范解析【教程】  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  免费网站制作appp,免费制作app哪个平台好?  如何在腾讯云服务器快速搭建个人网站?  香港服务器部署网站为何提示未备案?  HTML 中如何正确使用模板变量为元素的 name 属性赋值  Laravel如何自定义错误页面(404, 500)?(代码示例)  郑州企业网站制作公司,郑州招聘网站有哪些?