一、引入maven依赖
<!-- hutool-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.1.0</version>
</dependency>
<!-- mica-xss攻击 -->
<dependency>
<groupId>net.dreamlu</groupId>
<artifactId>mica-core</artifactId>
<version>2.0.9-GA</version>
</dependency>
<dependency>
<groupId>net.dreamlu</groupId>
<artifactId>mica-xss</artifactId>
<version>2.0.9-GA</version>
</dependency>
二、定义过滤器 XssFillter继承Fillter拦截http请求
@WebFilter(urlPatterns = "/*")
public class XssFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
XssHttpServletRequestWrapper wrapper = new XssHttpServletRequestWrapper(request);
filterChain.doFilter(wrapper,servletResponse);
}
@Override
public void destroy() {
}
}
三、使用工具类继承 HttpServletRequestWrapper 进行请求转义

public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
public XssHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
}
@Override
public String getParameter(String name) {
String value = super.getParameter(name);
if (!StrUtil.hasEmpty(value)) {
value = HtmlUtil.filter(value);
}
return value;
}
@Override
public String[] getParameterValues(String name) {
String[] values = super.getParameterValues(name);
if (values != null) {
for (int i = 0; i < values.length; i++) {
String value = values[i];
if (!StrUtil.hasEmpty(value)) {
value = HtmlUtil.filter(value);
}
values[i] = value;
}
}
return values;
}
@Override
public Map<String, String[]> getParameterMap() {
Map<String, String[]> parameters = super.getParameterMap();
LinkedHashMap<String, String[]> map = new LinkedHashMap();
if (parameters != null) {
for (String key : parameters.keySet()) {
String[] values = parameters.get(key);
for (int i = 0; i < values.length; i++) {
String value = values[i];
if (!StrUtil.hasEmpty(value)) {
value = HtmlUtil.filter(value);
}
values[i] = value;
}
map.put(key, values);
}
}
return map;
}
@Override
public String getHeader(String name) {
String value = super.getHeader(name);
if (!StrUtil.hasEmpty(value)) {
value = HtmlUtil.filter(value);
}
return value;
}
@Override
public ServletInputStream getInputStream() throws IOException {
InputStream in = super.getInputStream();
InputStreamReader reader = new InputStreamReader(in, Charset.forName("UTF-8"));
BufferedReader buffer = new BufferedReader(reader);
StringBuffer body = new StringBuffer();
String line = buffer.readLine();
while (line != null) {
body.append(line);
line = buffer.readLine();
}
buffer.close();
reader.close();
in.close();
String bodyInfo = body.toString();
Map<String, Object> map = null;
if (bodyInfo == null || bodyInfo.trim().length() == 0){
map = new HashMap<>(0);
}else{
map = JSONUtil.parseObj(body.toString());
}
Map<String, Object> result = new LinkedHashMap<>();
for (String key : map.keySet()) {
Object val = map.get(key);
if (val instanceof String) {
if (!StrUtil.hasEmpty(val.toString())) {
result.put(key, HtmlUtil.filter(val.toString()));
}
} else {
result.put(key, val);
}
}
String json = JSONUtil.toJsonStr(result);
ByteArrayInputStream bain = new ByteArrayInputStream(json.getBytes());
return new ServletInputStream() {
@Override
public int read() throws IOException {
return bain.read();
}
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
};
}
}
四、配置文件mica过滤请求、启动类上注册Filter
mica:
xss:
enabled: true
path-patterns:
@ServletComponentScan
@EnableTransactionManagement(proxyTargetClass = true)
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application .class,args);
}
}
五、实战模拟
@RequestMapping("/xss/{id}")
public String xss(String xss,String name){
}
@RequestMapping("/xss/{id}")
public String xss(@RequestParam("xss")String xss,@Param("name") String name
}
@RequestMapping("/xss/{id}")
public String xss(@PathVariable("id")String path){
}
@RequestMapping("/xss/{id}")
public String xss(@RequestParam(required = false)Map<String,Object> param){
}
@RequestMapping("/xss/{id}")
public String xss(@RequestBody(required = false) Map<String,Object> param){
System.out.println( param);
}
@RequestMapping("/xss/{id}")
public String xss(HttpServletRequest request){
String xss = request.getParameter("xss")
}
{
"name":"王某",
"age":12,
"param":"<script>alert(1)<script/>",
"xss":"<button>test</button>"
}
解决思路:
mica不能过滤reqeust.getParameter(“param”)方式的xss攻击,使用filter是为了重写 httpservlet ,springmvc做参数绑定时会调用httpservlet 中的方法进行动态绑定,在springmvc绑定参数前使用HtmlUtil.filter进行xss转义。