JSP spring boot / cloud 使用filter防止XSS

一.前言
XSS(跨站脚本攻击)
跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
二.思路
基于filter拦截,将特殊字符替换为html转意字符 (如: "<" 转意为 "<") , 需要拦截的点如下:
三.实现
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
相关文章:
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
网站制作的方法有哪些,如何将自己制作的网站发布到网上?
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
简单实现Android验证码
网页设计与网站制作内容,怎样注册网站?
网站制作企业,网站的banner和导航栏是指什么?
网站制作壁纸教程视频,电脑壁纸网站?
如何在企业微信快速生成手机电脑官网?
如何制作算命网站,怎么注册算命网站?
如何在Windows服务器上快速搭建网站?
如何用VPS主机快速搭建个人网站?
北京网站制作公司哪家好一点,北京租房网站有哪些?
潮流网站制作头像软件下载,适合母子的网名有哪些?
如何在服务器上三步完成建站并提升流量?
建站之星2.7模板快速切换与批量管理功能操作指南
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
如何通过服务器快速搭建网站?完整步骤解析
如何通过老薛主机一键快速建站?
如何高效配置香港服务器实现快速建站?
Swift中switch语句区间和元组模式匹配
学校为何禁止电信移动建设网站?
h5网站制作工具有哪些,h5页面制作工具有哪些?
实现虚拟支付需哪些建站技术支撑?
建站之星安装路径如何正确选择及配置?
如何在云虚拟主机上快速搭建个人网站?
如何在云主机上快速搭建多站点网站?
如何在宝塔面板中修改默认建站目录?
孙琪峥织梦建站教程如何优化数据库安全?
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
如何选择适合PHP云建站的开源框架?
PHP 500报错的快速解决方法
香港服务器租用费用高吗?如何避免常见误区?
在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?
建站之星代理费用多少?最新价格详情介绍
如何快速生成专业多端适配建站电话?
网站建设设计制作营销公司南阳,如何策划设计和建设网站?
南京网站制作费用,南京远驱官方网站?
C++时间戳转换成日期时间的步骤和示例代码
存储型VPS适合搭建中小型网站吗?
建站之星安装后如何配置SEO及设计样式?
购物网站制作公司有哪些,哪个购物网站比较好?
免费网站制作appp,免费制作app哪个平台好?
网站制作模板下载什么软件,ppt模板免费下载网站?
网站制作需要会哪些技术,建立一个网站要花费多少?
Android自定义控件实现温度旋转按钮效果
如何在万网开始建站?分步指南解析
ui设计制作网站有哪些,手机UI设计网址吗?
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?
*请认真填写需求信息,我们会在24小时内与您取得联系。