您现在的位置是:首页 > 正文

spring mvc xss html,SpringMvc防御XSS实践

2024-02-01 00:10:25阅读 2

项目在漏洞扫描时发现xss漏洞, 本以为是常见漏洞,网上有很多解决方案,应该能很快搞定,但实际上文章看了不少,却并未找到十分“顺手”的解决方案。

历经波折终于完成了一套自己想要的方案,现将过程分享出来,希望能帮助到遇到同样的问题人。

方案目标:

只配置一次,与业务接口无关

过滤两种请求的参数:Content-Type为form表单(application/x-www-form-urlencoded)和 json(application/json)

application/json

对于json请求,spring mvc默认使用MappingJackson2HttpMessageConverter转换器,

而它是使用jackson来序列化对象的,如果我们能 将jackson的序列化和反序列化过程修改,加入过滤xss代码,并将其注册到MappingJackson2HttpMessageConverter中,那么就能解决json请求的xss问题,而且我相信jackson肯定有这种接口。

具体实现:

StdSerializer

自定义序列化类

/**

* 序列化

* @date: 2017-12-15.

*/

public class DefaultJsonSerializer extends StdSerializer {

public DefaultJsonSerializer() {

this(null);

}

public DefaultJsonSerializer(Class t) {

super(t);

}

@Override

public void serialize(String value, JsonGenerator gen, SerializerProvider serializers)

throws IOException {

// xss策略在此执行

String safe = HtmlUtils.htmlEscape(value, "utf-8");

gen.writeString(safe);

}

}

StdDeserializer

自定义反序列化类

/**

* 反序列化

* @date: 2017-12-15.

*/

public class DefaultJsonDeserializer extends StdDeserializer {

public DefaultJsonDeserializer() {

this(null);

}

public DefaultJsonDeserializer(Class t) {

super(t);

}

@Override

public String deserialize(JsonParser p, DeserializationContext ctxt)

throws IOException {

String value = p.getValueAsString();

if (StringUtils.isEmpty(value)) {

return value;

} else {

value = HtmlUtils.htmlEscape(value.toString(), "utf-8");

return value;

}

}

}

配置HttpMessageConverter

java config配置

// WebMvcConfigurerAdapter子类中添加如下代码:

@Override

public void configureMessageConverters(List> converters) {

SimpleModule module = new SimpleModule();

module.addDeserializer(String.class, new DefaultJsonDeserializer());

module.addSerializer(String.class, new DefaultJsonSerializer());

ObjectMapper mapper = Jackson2ObjectMapperBuilder.json().build();

//注册自定义的序列化和反序列化器

mapper.registerModule(module);

MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(mapper);

converters.add(converter);

}

// configureMessageConverters会覆盖spring默认的转换器,如果想额外添加一个自定义的转换器

重写extendMessageConverters方法

@Override

public void extendMessageConverters(List> converters) {

//...额外添加转换器....

}

xml配置

application/x-www-form-urlencoded

使用@InitBinder,控制器中添加如下代码

@InitBinder

public void initBinder(WebDataBinder binder) {

// 注意CustomStringEditor为非线程安全类,故这里需构建对象,不能直接

// 注入bean

binder.registerCustomEditor(String.class, new CustomStringEditor());

}

自定义类型转换器 继承PropertyEditorSupport

public class CustomStringEditor extends PropertyEditorSupport {

@Override

public void setAsText(String text) throws IllegalArgumentException {

if (text == null || text.equals("")) {

text = "";

}

// xss过滤,表单提交时封装参数,String类型会经过此处

text = HtmlUtils.htmlEscape(text, "utf-8");

setValue(text);

}

@Override

public String getAsText() {

return getValue().toString();

}

}

接下来,启动测试即可。

目前代码已经存放到github上,欢迎star 和 fork,指出问题,一起学习交流

网站文章

  • cad面积计算机,AutoCAD如何测面积 AutoCAD面积计算方法

    cad面积计算机,AutoCAD如何测面积 AutoCAD面积计算方法

    在AutoCAD运用的实例中,我们常常需要测量所画图形的尺寸面积,如果通过手算的方式总会觉得特别麻烦,还容易出错,为此小编特意为大家准备了最全面的CAD面积计算方法,教你如何巧妙的使用AutoCAD完...

    2024-02-01 00:10:17
  • Jest 学习03 - Mock 函数、声明周期钩子

    Mock 函数Mock Functions(模拟函数)也被称为“spies”(间谍),官方文档:Mock Functions介绍Mock Functions 的使用方法是抹除函数的实际实现,捕获对函数...

    2024-02-01 00:09:47
  • 解析网页--BeautifulSoup-bs4-python爬虫知识点6

    BeautifulSoup 一、BeautifulSoup基本信息 定义 主要学bs4.BeautifulSoup,bs4内的一个非常好用的模块,美丽的汤,bs4:Beautiful Soup4 Be...

    2024-02-01 00:09:40
  • Maven传递依赖的原则

    maven引入的传递性依赖机制,一方面大大简化和方便了依赖声明,大部分情况下我们只需要关心项目的直接依赖是什么,而不永哥你考虑这些直接依赖会引入什么传递性依赖。但有时候,当歘地形依赖造成问题时,我们就需要清除知道该传递性依赖是从哪条依赖路径引入的。如下示例:1.依赖同一个jar包,深度不同:A->B->C->X(1.0)   依赖深度为3A->D->X(2.0)   依赖深度为2

    2024-02-01 00:09:34
  • 1951 查询具有最多共同关注者的所有两两结对组

    1951 查询具有最多共同关注者的所有两两结对组

    题目描述:写出一个查询语句,找到具有最多共同关注者的所有两两结对组。换句话说,如果有两个用户的共同关注者是最大的,我们应该返回所有具有此最大值的两两结对组The result table should...

    2024-02-01 00:09:06
  • axios拦截器之重复请求取消上次请求、路由切换取消接口

    在项目中经常会遇到需要主动取消接口的场景,axios提供CancelToken的功能可以主动停止当前请求,从而避免无效请求,优化网络性能场景:远程搜索接口频繁请求,第二个接口先成功导致显示第一个接口返...

    2024-02-01 00:08:58
  • CrawlSpider爬虫实战-猎云网爬虫(过程超详细)

    CrawlSpider爬虫实战-猎云网爬虫(过程超详细)

    CrawlSpider爬虫作用:可以定义规则,让Scrapy自动的去爬取我们想要的链接。而不必跟Spider类一样,手动的yield Request。创建:scrapy genspider -t cr...

    2024-02-01 00:08:51
  • swarm系列-swarm可视化之visualizer(4)

    swarm系列-swarm可视化之visualizer(4)

    visualizer是官方的简单容器状态可视化工具安装docker run -it -d -p 5000:8080 \ -v /var/run/docker.sock:/var/run/docker.sock \ dockersamples/visualizer访问ip:5000访问页面查看 ...

    2024-02-01 00:08:44
  • 数据集ISCX(12年到17年)已经打包,可下载

    数据集ISCX(12年到17年)已经打包,可下载

    感兴趣的可私聊下载。

    2024-02-01 00:08:15
  • 配置grails后,dos命令行出现如下错误

    配置grails后,dos命令行出现如下错误。我的java的环境变量设置也是正确的,平时运行java程序也没有出过问题,但是这里确提示我的JAVA_HOME是一个无效的目录,到网上看了一下,原来是JAVA_HOME所配置的名字不识别。C:\Users\JavaPlus>grails -versionERROR: JAVA_HOME is set to an invalid di

    2024-02-01 00:08:09