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转意字符 (如: "<" 转意为 "<") , 需要拦截的点如下:
- 请求头 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)?(代码示例)
郑州企业网站制作公司,郑州招聘网站有哪些?

