1. 什么是XSS攻击&XSS攻击应用场景
- XSS其实就是使用javascript脚本语言注入进行攻击
- XSS攻击场景:
具体例子A请求提交表单信息,表单信息转发到另一个页面进行展示。
有一些钓鱼网站,在提交参数的后面带上XSS脚本攻击 举例
http://pay.itmayiedu.com/pay?userId=10&money=500&userName=
2. XSS脚本攻击原理分析
- XSS攻击原理:使用js脚本语言,因为浏览器默认支持脚本语言执行,如果在表单提交的时候,提交一些脚本参数,可能浏览器直接进行执行。
- XSS攻击最大常见漏洞(论坛、评论)
- 防御手段
像一些特殊字符,比如<, > 如果不进行特殊字符处理的话,就很可能受到XSS攻击
用户如果提交< 转换成<
3. 使用过滤器防御XSS攻击
@WebFilter(filterName = "xssFilter", urlPatterns = "/*")
public class XSSFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException{
//程序防止XSS攻击原理
//1. 使用过滤器拦截所有参数
HttpServletRequest servletRequest = (HttpServletRequest) request;
//2. 重写getParameter方法
XssHttpServletRequestWrapper xssHttpServletRequestWrapper = new XssHttpServletRequestWrapper(servletRequest);
chain.doFilter(xssHttpServletRequestWrapper, response);
}
@Override
public void destroy() {
}
}
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
private HttpServletRequest request;
public XssHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
this.request = request;
}
@Override
public String getParameter(String name) {
// 过滤getParameter参数 检查是否有特殊字符
String oldValue = super.getParameter(name);
System.out.println("【转换前】" + oldValue);
if (!StringUtils.isEmpty(oldValue)) {
oldValue = StringEscapeUtils.escapeHtml4(oldValue);
}
System.out.println("【转换后】" + oldValue);
return oldValue;
}
}
SpringBoot启动加上@ServletComponentScan
4. 使用#传递参数防御SQL注入攻击
#{}: 解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个 #{ } 被解析为一个参数占位符,可以防止SQL注入问题。
${}: 仅仅为一个纯碎的 string 替换,在动态 SQL 解析阶段将会进行变量替换。