项目的xss攻击拦截
项目要上线的话,需要检查下有没有xss攻击的风险。
什么是xss,简单来说,就是前端输入类型然后存储到后端,前端下次获取这个数据的时候,因为直接显示到前端的话,因为被认为是js脚本,直接执行了。这个风险在于如果这个显示是公共的资源的话,可能让用户执行一些恶意的js,比如将密码通过js发送到固定接口。
那怎么拦截呢。
前端可能处理的话,就是利用显示的时候,敏感字符转义后显示。
我们后端的处理的,就是拦截参数,要么是在前端输入存储到数据库之前的时候,转义敏感字符。
要么是显示到前端前,反序列化前转义敏感字符。
针对前端输入存储到数据库前,如果我们代码手动编码的话,比较麻烦。有没有办法可以直接指定参数xss过滤?
这个我们需要了解下springmvc的参数接收原理。
https://blog.csdn.net/weixin_34216036/article/details/91696361
自定义参数解析器
https://www.jianshu.com/p/6eba4e2c6cab
https://blog.csdn.net/bestxiaok/article/details/88807212
https://www.cnblogs.com/java-zhao/p/9119258.html
本来想重写参数解析器的,但是感觉跟原有项目不兼容,因为如果重写解析器的话,每个接口都要加上自定义的参数解析器了。
换个思路,我们后端项目基本接受参数也就三种方式。
1.get直接获取参数
2.post通过表单方式,或者json格式获取对象。
有没有办法可以在这里做手脚。
https://www.freesion.com/article/7503775029/
基本也有这么几个思路。网上思路总结为两种,
一种是重写wrapper,这个针对表单能有效拦截。
Content-Type | 传参方式 | 接收方式 |
---|---|---|
application/x-www-form-urlencoded | 表单key-value | HttpServletRequest Parameters 获取 multipart/form-data |
multipart/form-data | 表单key-value | HttpServletRequest Parameters 获取 |
但是这种拦截对于post的json没效果
Content-Type | 传参方式 | 接收方式 |
---|---|---|
application/json | json格式文本 | HttpServletRequest IO流获取 |
主要原因还是在于获取参数方式不同。
这个网上给出的方案是继承 WebMvcConfigurationSupport 类后,重写MappingJackson2HttpMessageConverter,遍历转化器列表,找到MappingJackson2HttpMessageConverter,可以根据类型来判断哪个是 MappingJackson2HttpMessageConverter ,然后移除(注意遍历移除一定要用迭代器),把我们自定义的转化器添加进去。替换默认的MappingJackson2HttpMessageConverter,过滤(json请求参数)xss
使用此方法之后,在控制层跳转页面会出现静态资源无法访问的情况(可以自己重写addResourceHandlers()这个方法来访问资源文件)。
因为继承WebMvcConfigurationSupport 会使原本的 springboot 的自动配置类失效,所以框架帮我们自动配置的就没了
我遇到的是两个问题,一个是静态资源访问问题,一个是json配置的日期转化异常问题。
还有一种是实现 WEBMVCCONFIGURER、INITIALIZINGBEAN 类 ,在注入objectMapper的时候,注入自定义的配置。
https://www.freesion.com/article/7503775029/
get请求的话,非要拦截的话,建议自定义PropertyEditor
https://blog.csdn.net/Newerwu/article/details/113374479
问题
这里针对get和post请求,都有自定义的xss过滤方法,但是有这么一个问题,这个是全局的处理器。也就是说,只要加了,后续的get,post请求的xss过滤就会生效,然后那么对应的带有敏感字符的都会被转义。但是如果说我部分接口不想转义呢?
没办法,我真的没办法。
本来的话,思路是,能不能在对应的地方,加个注解,说这个地方不用转义。
我们可以看出,之前的处理方式都是通过重写ObjectMapper的对应的反序列化器,这样的话,springmvc的反序列化就能针对特殊字符转义了。
https://blog.csdn.net/pistolove/article/details/50868105
我本来以为objectmapper有对应的前置处理器,但是没有,没有,没有,我找了一晚上,没找到。有大佬知道,jackson属性注入前有办法,或者有前置处理器吗
JacksonAnnotationIntrospector,JsonFilter拦截器和过滤器没办法满足我的要求。这咋整。
https://www.iflym.com/index.php/code/201906190001.html
https://www.cnblogs.com/rollenholt/p/5406573.html
那么我就只能退而求其次。能不能在接受参数后,处理xss?
然后百度一下,有没有办法requestbody参数后置处理。
然后发现了这个
https://blog.csdn.net/xingbaozhen1210/article/details/98189562
那么我就只能退而求其次,写个自己的注解,在requestbody前加个自己的注解,决定是不是xss过滤了。