首先说一下什么是XSS攻击
XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,
故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web
用户将代码植入到提供给其它用户使用的页面中。
白话解释
说白了xss攻击就是jq或html代码攻击,用户提交的数据是jq或html代码,
前台拿到数据库中查出的jq或html代码,浏览器会直接解析执行
实现思路
重写request.getParamter()方法,在controller获取参数之前进行jq代码转换,也就是将
<Script>所有标签代码进行替换,在这里要注意,HttpServletRequest是个接口,
它的实现类是HttpServletRequestWrapper,所以只需要继承HttpServletRequestWrapper,
重写request.getParamter方法,在通过过滤器将原本的HttpServeltRequest替换为自定义的HttpServeltRequest
代码
1.自定义类继承HttpServletRequestWrapper重写getParamter
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {public XssHttpServletRequestWrapper(HttpServletRequest request) {super(request);}@Overridepublic String getParameter(String name) {String parameter = super.getParameter(name);if(StringUtils.isNotBlank(parameter)){//这里使用的阿帕奇的common-lang3中的转义html方法,也可以自己实现,String escapeParameter = StringEscapeUtils.escapeHtml(parameter);System.out.println(escapeParameter);return escapeParameter;}return null;}
}
2.自定义过滤器,使用自定义的HttpServletRequest
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;@Component
@WebFilter(urlPatterns = {"/*"},filterName = "xssFilter")
public class XssFilter implements Filter{@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {XssHttpServletRequestWrapper req=new XssHttpServletRequestWrapper((HttpServletRequest)request);chain.doFilter(req,response);}@Overridepublic void destroy() {}
}