一、前言
xss脚本注入攻击大家应该经常见了,不多说了,直接讲防xss脚本注入的原理吧。
二、原理
原理很简单,http后端通过过滤器过滤request接受的参数内容,把包含”<“、”>”,”&”、”/“和“””的字符进行转义即可。
例如:
普通注入脚本
<script>alert("xss脚本攻击");</script>
复制代码
通过标签事件监听注入脚本
<a onload="javascript:alert('通过标签事件监听注入脚本')">自动加载</a>
复制代码
不论是哪种方式,它们都有个共同点,那就是需要html/js作为载体,那事情就简单了,只要破坏这个结构就好了,如何破坏呢,将包含”<“、”>”,”,”&”、”/“和“””的字符转义,如果把这些字符转义了,例如把上面的转义成下面的这样:
转义后的普通注入脚本
<script>alert("xss脚本攻击");</script>
复制代码
转义后的标签事件监听注入脚本
<a onload="javascript:alert('通过标签事件监听注入脚本')">自动加载</a>
复制代码
注入的脚本就再也无法运行了,而且还不影响前端显示,前端依然显示的是
<script>alert("xss脚本攻击");</script>
复制代码
但是却无法执行任何脚本了。
三、springmvc如何实现xss过滤
3.1、xss转义包装器
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.springframework.web.util.HtmlUtils;
/**
* 过滤xss脚本注入的请求包装器
* @author eguid
*/
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
public XssHttpServletRequestWrapper(HttpServletRequest servletRequest) {
super(servletRequest);
}
public String[] getParameterValues(String parameter) {
String[] values = super.getParameterValues(parameter);
if (values == null)
return null;
int count = values.length;
String[] encodedValues = new String[count];
for (int i = 0; i < count; i++) {
encodedValues[i] = HtmlUtils.htmlEscape(values[i]);
}
return encodedValues;
}
public String getParameter(String parameter) {
String value = super.getParameter(parameter);
if (value == null)
return null;
return HtmlUtils.htmlEscape(value);
}
public String getHeader(String name) {
String value = super.getHeader(name);
if (value == null)
return null;
return HtmlUtils.htmlEscape(value);
}
}
复制代码
3.2 xss过滤器
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;
/**
* 防xss脚本注入攻击过滤器,使用了springmvc自带的HtmlUtils进行过滤html标签转义(对"<"、">"、"("、")"转义使脚本无效)
* @author eguid
*/
public class XssFilter implements Filter {
FilterConfig filterConfig = null;
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
public void destroy() {
this.filterConfig = null;
}
// 对request进行包装
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
chain.doFilter(new XssHttpServletRequestWrapper(
(HttpServletRequest) request), response);
}
}
复制代码
3.3 web.xml配置过滤器
<!-- xss过滤器 -->
<filter>
<filter-name>xssFilter</filter-name>
<!--替换成自己实现的过滤器类路径-->
<filter-class>cc.eguid.web.filter.XssFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>xssFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
复制代码
到这里为止,我们就完成了web后端服务接口的防xss跨站脚本注入攻击了。
如果觉得写得还不错,欢迎”关注、点赞、收藏“支持一波。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END