对于XSS攻击,一种有效的防范措施是重写过滤器的方式来过滤一些有潜在风险的过滤器。
过滤策略:把特殊字符转为HTML实体编码,
这样存在数据库里较安全
返回给前端时会被js解析为正常字符,不影响查看
eg:比如我处后端的处理字符串的操作有一个是:
str = str.replaceAll("\\?", "?");
这里以百度网盘为例,当前比如网页是:
http://pan.baidu.com/disk/main?from=oldversion#/brand
我想要进入别人的网盘
那么当我改导航时,http://pan.baidu.com/disk/main?from=***
此时,传入的request(也就是后端的str字符串)会把?替换成?然后命令就失效了。
如果在前端显示的话,?恰好能在前端显示出来"?",所以这是一种可能的方法解决XSS攻击的过滤器,我们直接上代码。
需要新建两个类
首先新建一个类XSSFilter;
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 destroy() {
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
throws IOException, ServletException {
arg2.doFilter(new XSSRequestWrapper((HttpServletRequest) arg0), arg1);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
在新建一个类XSSRequestWrapper;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.regex.Pattern;
public class XSSRequestWrapper extends HttpServletRequestWrapper {
public XSSRequestWrapper(HttpServletRequest servletRequest){
super(servletRequest);
}
@Override
public String getHeader(String name){
return super.getHeader(name);
}
@Override
public String getParameter(String name){
String value = super.getParameter(name);
return xssEncode(value);
}
//对以FormData形式提交,Content-Type:application/x-www-from-urlencoded参数过滤
@Override
public String[] getParameterValues(String name){
String[] values=super.getParameterValues(name);
if(values==null){
return null;
}
int count=values.length;
String[] encodeValues=new String[count];
for(int i=0;i<count;i++){
encodeValues[i]=xssEncode(values[i]);
}
return encodeValues;
}
/*过滤策略:把特殊字符转为HTML实体编码,
*这样存在数据库里较安全
*返回给前端时会被js解析为正常字符,不影响查看*/
public static String xssEncode(String str){
if(str == null || str.isEmpty()){
return str;
}
str = str.replaceAll(";", ";");
str = str.replaceAll("<", "<").replaceAll(">", ">");
str = str.replaceAll("\\(", "(").replaceAll("\\)", ")");
str = str.replaceAll("'", "'").replaceAll("\"", """);
str = str.replaceAll("\\$", "$");
str = str.replaceAll("%", "%");
str = str.replaceAll("\\/", "/").replaceAll("\\\\", "\");
str = str.replaceAll(":", ":");
str = str.replaceAll("\\?", "?").replaceAll("@", "@");
str = str.replaceAll("\\^", "^");
return str;
}
}
那么接下来就是最后一步了,那就是配置啦。
我们需要在web.xml里加入如下的配置信息
<filter>
<filter-name>XSSFilter</filter-name>
<filter-class>Protect.XSSFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>XSSFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
那么我们的整个项目就有过滤器了哦,快去试试吧!
如果有错误请指正。
如果觉得不错给作者一个免费的的点赞吧。