什么是XSS?
百度百科的解释: XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。
它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制,获取用户的一些信息。
分类
- 非持久型
- 持久型
- 反射型。发出请求时,XSS代码出现在URL中,作为输入提交到服务器端,服务器端解析后
响应,XSS代码随响应内容一起传回给浏览器,最后浏览器解析并执行XSS代码,这个过程
像一次反射,故叫反射型XSS - 存储型。存储型和反射型XSS的差别在于提交的代码会存储在服务器端(数据库、内存、文
件系统等),下次请求目标页面时不用再提交XSS代码 - DOM。不经过后端,DOM—based XSS漏洞是基于文档对象模型Document Objeet
Model,DOM)的一种漏洞,dom - xss是通过url传入参数去控制触发的。
- 反射型。发出请求时,XSS代码出现在URL中,作为输入提交到服务器端,服务器端解析后
风险
该漏洞可能被攻击者利用窃取或操纵客户会话和Cookie,它们可能用于模仿合法用户,从而使黑客能够以合法用户身份登录系统进行渗透。可执行攻击者恶意脚本。
常用修复方式
- 前、后端对所有参数依次过滤
- 对之前程序接收参数处添加过滤
缺点
- 依次添加,工作量大,容易遗漏
- 到处可见重复代码
- 新添加接口很容易将问题重新引入
过滤器防御实现
自定义过滤器Filter拦截请求,并对请求参数进行xss过滤处理
/**
*XSS过滤器
*/
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 {
//使用包装器
XSSRequestWrapper XSSRequestWrapper=new XSSRequestWrapper((HttpServletRequest) servletRequest);
filterChain.doFilter(XSSRequestWrapper,servletResponse);
}
@Override
public void destroy() {
}
}
/**
* Request的包装类
*
*/
public class XSSRequestWrapper extends HttpServletRequestWrapper {
private Map <String,String[]> paramsMap = null;
public XSSRequestWrapper(HttpServletRequest request) {
super(request);
try {
request.setCharacterEncoding("UTF-8");
} catch (UnsupportedEncodingException var8) {
var8.printStackTrace();
}
this.parameterMap = new HashMap();
Enumeration<String> parameterNames = request.getParameterNames();
String name = null;
String[] values = null;
for(List whiteList = Arrays.asList("headerData"); parameterNames.hasMoreElements(); this.parameterMap.put(name, values)) {
name = (String)parameterNames.nextElement();
values = request.getParameterValues(name);
if (values != null && values.length > 0) {
for(int itemId = 0; itemId < values.length; ++itemId) {
if (!whiteList.contains(name)) {
values[itemId] =htmlEncode(values[itemId]);
}
}
}
}
}
public Enumeration<String> getParameterNames() {
Vector<String> vector = new Vector(this.parameterMap.keySet());
return vector.elements();
}
public Map<String, String[]> getParameterMap() {
return this.parameterMap;
}
public String getParameter(String name) {
String[] results = (String[])this.parameterMap.get(name);
return results != null && results.length > 0 ? results[0] : "";
}
private static String htmlEncode(String html) {
String str = getString(html);
if (!StringUtil.IsEmpty(str)) {
str = str.replace("&", "&");
str = str.replace("<", "<");
str = str.replace(">", ">");
str = str.replace("\"", """);
str = str.replace("'", "'");
str = str.replace("\"", """);
}
return str;
}
}
网友评论