WEB安全扫描解决 XSS 攻击的解决方案

xss(跨站脚本攻击)

跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

 

新方案

对于出现的问题,我这里有两点需要说,其一就是针对后台的验证逻辑,这个没有必要再详细说了,无非就行完善验证逻辑,针对可能出现的情况进行抽象,抽出通用的验证逻辑,对于个别的验证就单独处理,不过还是要考虑代码的复用性。

其二,是关于 XSS 攻击全局处理的。我这里给出两种解决方案,详述如下。

方案一

如果你遇到的情况,对与用户的输入、输出有明确的限制,而且对于特殊字符也有明确的规定,那么你可以自己写一个 XSSFilter,使用上面提到的情况二,对不建议输入的特殊字符进行过滤和清理,包括 SQL 注入的一些敏感信息,都是要过滤掉的。基本的 Filter 网上都有,你要做的就是针对自己的业务,再加入对危险字符的处理即可。

 

方案二

想到一句老话,站在巨人的肩膀上。第二种方案,就是站在巨人的肩膀上。推荐一款开源插件,xssProject,具体作者不详。GoogleCode 中提供相应了的源代码。想研究的可以自己去找一下。下面着重讲一下,如何在项目中集成 xssProject,并使之为我们服务。

首先,项目中需要引入 xssProtect-0.1.jar、antlr-3.0.1.jar、antlr-runtime-3.0.1.jar 等3个 jar 包。

然后,封装 request,代码如下。

public class NewXssHttpServletRequestWrapper extends HttpServletRequestWrapper {
 
	HttpServletRequest orgRequest = null;
	
	public NewXssHttpServletRequestWrapper(HttpServletRequest request) {
		super(request);
        orgRequest = request;
	}
	
 
    /**
     * 覆盖getParameter方法,将参数名和参数值都做xss过滤。<br/>
     * 如果需要获得原始的值,则通过super.getParameterValues(name)来获取<br/>
     * getParameterNames,getParameterValues和getParameterMap也可能需要覆盖
     */
    @Override
    public String getParameter(String name)
    {
    	System.out.println("NewXssFilter处理前的 Value = " + super.getParameterValues(name));
    	
        String value = super.getParameter(xssEncode(name));
        if (value != null)
        {
            value = xssEncode(value);
        }
        
        System.out.println("NewXssFilter处理后的 Value = " + value);
        
        return value;
    }
 
    /**
     * 覆盖getHeader方法,将参数名和参数值都做xss过滤。<br/>
     * 如果需要获得原始的值,则通过super.getHeaders(name)来获取<br/> getHeaderNames 也可能需要覆盖
     */
    @Override
    public String getHeader(String name)
    {
 
        String value = super.getHeader(xssEncode(name));
        if (value != null)
        {
            value = xssEncode(value);
        }
        return value;
    }
 
    /**
     * 将容易引起xss漏洞的半角字符直接替换成全角字符
     * 
     * @param s
     * @return
     */
    private static String xssEncode(String s)
    {
        if (s == null || s.isEmpty())
        {
            return s;
        }
        
        StringReader reader = new StringReader( s );
        StringWriter writer = new StringWriter();
        try {
            HTMLParser.process( reader, writer, new XSSFilter(), true );
            
            return writer.toString();
        } 
        catch (NullPointerException e) {
            return s;
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
        
        return null;
        
    }
 
    /**
     * 获取最原始的request
     * 
     * @return
     */
    public HttpServletRequest getOrgRequest()
    {
        return orgRequest;
    }
 
    /**
     * 获取最原始的request的静态方法
     * 
     * @return
     */
    public static HttpServletRequest getOrgRequest(HttpServletRequest req)
    {
        if (req instanceof NewXssHttpServletRequestWrapper)
        {
            return ((NewXssHttpServletRequestWrapper) req).getOrgRequest();
        }
 
        return req;
    }
 
}

 

再然后,创建过滤器 NewXssFilter 。

public class NewXssFilter implements Filter {
 
	FilterConfig filterConfig = null;
 
	@Override
	public void destroy() {
		this.filterConfig = null;
	}
 
	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		String path = ((HttpServletRequest) request).getContextPath();
		String basePath = request.getScheme() + "://" + request.getServerName()
				+ ":" + request.getServerPort() + path + "/";
 
		// HTTP 头设置 Referer过滤
		String referer = ((HttpServletRequest) request).getHeader("Referer"); // REFRESH
		if (referer != null && referer.indexOf(basePath) < 0) {
			((HttpServletRequest) request).getRequestDispatcher(
					((HttpServletRequest) request).getRequestURI()).forward(
					((HttpServletRequest) request), response);
			System.out.println("referer不为空,referer >>>>>>>>>>>>>> " + referer);
		}
		NewXssHttpServletRequestWrapper xssRequest = new NewXssHttpServletRequestWrapper((HttpServletRequest) request);
		chain.doFilter(xssRequest, response);
	}
 
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		this.filterConfig = filterConfig;
	}
 
}

最后,在 web.xml 中配置过滤器 。

<filter>
	<filter-name>XssSqlFilter</filter-name>
	<filter-class>com.***.web.common.NewXssFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>XssSqlFilter</filter-name>
	<url-pattern>/*</url-pattern>
	<dispatcher>REQUEST</dispatcher>
</filter-mapping>

 

以上这些就是全部的内容了,针对 XSS 攻击的解决方案,写出来跟大家分享,个人建议使用 xssProject 来解决这一问题。毕竟 xssProject 已经提供了很完善的过滤、处理方案,你可以通过研究他的代码来进行扩展,如果需要的话。最后附上 xssProject 所需的三个 jar 包。

https://download.csdn.net/download/qq_36908872/10689585

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值