Web 安全越来越重要,Web 开发者一定听说过 XSS 攻击,但不一定知道如何防御它,本文将借助 filter 过滤器配合 XssHttpServletRequestWrapper 以及 commons-lang3-3.1.jar 来过滤掉危险的 XSS 攻击。
更多精彩内容请看 web 前端中文站
http://www.lisa33xiaoq.net 可按 Ctrl + D 进行收藏
本文主要用到了 commons-lang3-3.1.jar 这个包的 org.apache.commons.lang3.StringEscapeUtils.escapeHtml4() 这个方法。
什么是 XSS 攻击?
XSS 攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为 XSS,XSS 是一种在 web 应用中的计算机安全漏洞,它允许恶意 web 用户将代码植入到提供给其它用户使用的页面中。
说白了,XSS 攻击就是利用 JavaScript,html 等对目标页面进行改造,或者说是伪造,用来获取账号密码,操作系统权限等的一种方式。
知道了 XSS 攻击的原理,下面我们就一起来过滤掉这类漏洞。
过滤 XSS 攻击的原理
通过上面的介绍我们知道了 XSS 攻击。那么我们就需要在输入时对特殊字符如<>" ' & 转义。然后在页面显示时,在转换过来。
了解了这些后,我们先来实现一个 XssFilter 用来拦截用户的输入请求。
package com.lisa33xiaoq.net.filter; 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 doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { chain.doFilter(new XssHttpServletRequestWrapper((HttpServletRequest) request), response); } @Override public void destroy() {} }
我们再实现一个用来 XssHttpServletRequestWrapper 过滤用户的输入内容。
package com.lisa33xiaoq.net.filter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import org.apache.commons.lang3.StringEscapeUtils; public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper { public XssHttpServletRequestWrapper(HttpServletRequest request) { super(request); } @Override public String getHeader(String name) { return StringEscapeUtils.escapeHtml4(super.getHeader(name)); } @Override public String getQueryString() { return StringEscapeUtils.escapeHtml4(super.getQueryString()); } @Override public String getParameter(String name) { return StringEscapeUtils.escapeHtml4(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] = StringEscapeUtils.escapeHtml4(values[i]); } return escapseValues; } return super.getParameterValues(name); } }
最后在 web.xml 中配置该 filter。
<filter> <filter-name>XssEscape</filter-name> <filter-class>com.lisa33xiaoq.net.filter.XssFilter</filter-class> </filter> <filter-mapping> <filter-name>XssEscape</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping>
最后在 jsp 页面上使用 jstl 标签 fn:escapeXml("") 对需要转移的内容进行转换显示。
有些情况不想显示过滤后内容的话,可以用 StringEscapeUtils.unescapeHtml4()这个方法,把 StringEscapeUtils.escapeHtml4()转义之后的字符恢复原样。
本文原文出处:web 前端中文站: » 利用 filter 和 commons-lang3 过滤掉 xss 攻击
【注:本文源自网络文章资源,由站长整理发布】