XSS脚本过滤

脚本攻击经常是项目测试人员或者“不法分子”闲着没事干,想办法让你的程序不正常,最近项目中刚好用到所以就贴出来做个笔记。

1.思路

我们可以通过servlet规范中的过滤器,对每一次请求进行过滤 --> 将请求参数获取到对脚本数据进行转义处理后再进行持久化操作,比如< script > < /script>中的''号。

2.配置过滤器

在项目中web.xml中添加:

XSSEscape

com.hp.up.front.xss.XSSFilter

XSSEscape

/*

REQUEST

其中com.hp.up.front.xss.XSSFilter就是过滤器路径

3.编写过滤器

自然是实现javax.servlet.Filter 重写doFilter了:

import java.io.IOException;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

public class XSSFilter implements Filter {

@Override

public void init(FilterConfig filterConfig) throws ServletException {

}

@Override

public void destroy() {

}

@Override

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

throws IOException, ServletException {

chain.doFilter(new XSSRequestWrapper((HttpServletRequest) request), response);

}

}

doFilter方法中传入XSSRequestWrapper对象,该类集成自HttpServletRequestWrapper,其实就是对HttpServletRequest中获取参数的方法的重写,从而实现对参数进行过滤、操作

b85bec74f0ec?from=singlemessage

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletRequestWrapper;

import org.apache.commons.lang.StringEscapeUtils;

public class XSSRequestWrapper extends HttpServletRequestWrapper{

public XSSRequestWrapper(HttpServletRequest request) {

super(request);

}

@Override

public String getHeader(String name) {

return StringEscapeUtils.escapeHtml(super.getHeader(name));

}

@Override

public String getQueryString() {

return StringEscapeUtils.escapeHtml(super.getQueryString());

}

@Override

public String getParameter(String name) {

return StringEscapeUtils.escapeHtml(super.getParameter(name));

}

@Override

public String[] getParameterValues(String name) {

String[] values = super.getParameterValues(name);

if(values != null) {

int length = values.length;

String[] escapseValues = new String[length];

for(int i = 0; i < length; i++){

escapseValues[i] = htmlEncode(values[i]);

}

return escapseValues;

}

return super.getParameterValues(name);

}

private static String htmlEncode(String source) {

if (source == null) {

return "";

}

String html = "";

StringBuffer buffer = new StringBuffer();

for (int i = 0; i < source.length(); i++) {

char c = source.charAt(i);

switch (c) {

case '

buffer.append("<");

break;

case '>':

buffer.append(">");

break;

case '&':

buffer.append("&");

break;

case '"':

buffer.append(""");

break;

case 10:

case 13:

break;

default:

buffer.append(c);

}

}

html = buffer.toString();

return html;

}

}

最终发现每次提交数据拦截器都会对数据中的脚本进行转义后再存到数据库中:

b85bec74f0ec?from=singlemessage

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐