SpringBoot 防 Xss 攻击
说明
这几天自己学习了一下 SpringBoot 项目怎么预防 Xss 攻击,这里记录一下怎么防止 Xss 攻击的代码,等以后有需要用到的话,自己可以快速找到。
依赖
这里需要注意的是 1.5 到 1.9 版本有高危漏洞,需要升级到 1.10.0 以上版本,这是当前时间最新的版本。
项目文件结构
处理非 application/json 提交方式使用下面二个类:
XssFilter 类,重写 doFilter 方法,然后调用 XssHttpServletRequestWrapper 类。
XssHttpServletRequestWrapper 类,只能对提交方式为 x-www-form-urlencoded 和 form-data 做特殊字符转换,不能对提交方式为 application/json 的数据格式做转换,如果没有指定提交方式,浏览器默认提交方式为 x-www-form-urlencoded。
处理 application/json 提交方式使用下面三个类:
XssStringJsonDeSerializer 类,这个类主要是对前端传递的数据格式为 json 格式的参数进行特殊字符转义。
XssStringJsonSerializer 类,这个类主要是处理后端向前端返回的 json 数据,将数据里面包含的特殊字符进行转义后发送。
JacksonConfig 类,调用上面 2 个自定义的序列化类,没有这个配置类,上面的 2 个类不会生效。
未处理 Xss 前的效果
测试代码:
在谷歌浏览器直接输入接口请求测试如下:
看到它这里是直接弹窗打印了,想要的返回值应该是浏览器页面中返回的是值才对。
处理非 application/json 提交方式的 xss 代码
XssFilter 类代码
XssHttpServletRequestWrapper 类代码
处理 Xss 后的效果
可以看到达到了自己想要的结果, 没有弹窗显示了,直接将结果正确显示到了页面中。
转义后的值如下:
但是这样对于 json 格式的数据起不到作用,如下图,发现并没有对里面的 <、>、” 这三个特殊符号进行转义:
处理 application/json 提交方式的 xss 代码
XssStringJsonDeSerializer 类代码
XssStringJsonSerializer 类代码
JacksonConfig 类代码
json 格式处理 Xss 后的效果
测试代码:
因为是 post 请求, 所以这里使用 postman 工具对接口进行测试:
发现已经转义成功。
注意事项(补充说明)
这个 JacksonConfig 类 里面的代码,我注释掉了对返回 json 数据格式做转义的处理。
不注释掉的话,会进行 2 次转义处理,效果如下:
它这里先是对入参 < 转义为<
,然后又将<
里面的 & 符合在返回给前端的时候又进行了一次转义,所以变成了&lt;
。
这一种会出现这一种情况,我这里用 txt 简单写一个 html 页面代码:
然后我将 txt 后缀改为 html,效果如下:
所以这里 JacksonConfig 类里面的 XssStringJsonSerializer 类调用需要根据自己的项目实际情况需要是否引用。
好了,笔记先做到这里,等以后自己有需要直接引用即可。