WEB安全实战(五)XSS 攻击的第二种解决方式(推荐)
序
旧方案
问题
新方案
<span style="font-family:Comic Sans MS;">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;
    }
    /**
     * 将easy引起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;
    }
}</span>
<span style="font-family:Comic Sans MS;">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;
	}
}</span>
最后,在 web.xml 中配置过滤器 。
<span style="font-family:Comic Sans MS;"><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></span>
结束语
WEB安全实战(五)XSS 攻击的第二种解决方式(推荐)的更多相关文章
- 使用 PHP 构建的 Web 应用如何避免 XSS 攻击
		本文首先简单介绍开发测试人员如何对 Web 应用进行 XSS 漏洞测试,如何借助工具绕过客户端 JavaScript 校验输入恶意数据:然后针对使用 PHP 语言构建的 Web 站点,从在输出端对动态 ... 
- Java Web使用过滤器防止Xss攻击,解决Xss漏洞
		转: Java Web使用过滤器防止Xss攻击,解决Xss漏洞 2018年11月11日 10:41:27 我欲乘风,直上九天 阅读数:2687 版权声明:本文为博主原创文章,转载请注明出处!有时候 ... 
- 使用Typescript重构axios(十九)——请求取消功能:实现第二种使用方式
		0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ... 
- python_并发编程——多进程的第二种启动方式
		1.多进程的第二种启动方式 import os from multiprocessing import Process # 创建一个自定义类,继承Process类 class MyProcess(Pr ... 
- Web 安全漏洞之 XSS 攻击
		什么是 XSS 攻击 XSS(Cross-Site Scripting)又称跨站脚本,XSS的重点不在于跨站点,而是在于脚本的执行.XSS是一种经常出现在 Web 应用程序中的计算机安全漏洞,是由于 ... 
- Web Api全局预防Xss攻击
		本文转载自https://www.cnblogs.com/ruanyifeng/p/4739807.html.对第二种过滤方法的代码进行了一些修改和注释,记录一下免得以后忘了.已经测试过,应该可以直接 ... 
- Web APi之认证(Authentication)两种实现方式后续【三】(十五)
		前言 之前一直在找工作中,过程也是令人着实的心塞,最后还是稳定了下来,博客也停止更新快一个月了,学如逆水行舟,不进则退,之前学的东西没怎么用,也忘记了一点,不过至少由于是切身研究,本质以及原理上的脉络 ... 
- Web APi之认证(Authentication)两种实现方式【二】(十三)
		前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再叙述废话. 序言 对于所谓的认证说到底 ... 
- 转 Web APi之认证(Authentication)两种实现方式【二】(十三)
		前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再废叙述废话. 序言 对于所谓的认证说到 ... 
随机推荐
- 使用Canvas和Paint自己绘制折线图
			主要用于Canvas一个特别简单的小demo. 能够手动点击看每一个月份的数据.很easy.就是用paint在canvas上画出来的. 主要内容就是计算左边价格的位置,以下日期的位置,三根虚线的位置, ... 
- BZOJ 3589 动态树 树链拆分+纳入和排除定理
			标题效果:鉴于一棵树.每个节点有一个右值,所有节点正确启动值他们是0.有两种操作模式,0 x y代表x右所有点的子树的根值添加y. 1 k a1 b1 a2 b2 --ak bk代表质疑. 共同拥有者 ... 
- Scrum三头猪
			猪和鸡在过去进入业务合作.他们都打算开一家餐厅,它的售价火腿和鸡蛋. 这想了一下时间猪,我用他的肉,鸡只是用它生下的蛋.万一生意失败,我自己的命就没,,没有不论什么影响. 1. Scrum两类关系人 ... 
- struts1吊牌<logic:iterate>
			<logic:iterate>主要用于处理网页上的输出集合,集合是其中一般下列之一: 1. java对象的数组 2. ArrayList.Vector.HashMap等 具体使用方法请參考 ... 
- 怎么理解Condition(转)
			在java.util.concurrent包中,有两个很特殊的工具类,Condition和ReentrantLock,使用过的人都知道,ReentrantLock(重入锁)是jdk的concurren ... 
- JavaScript阻止事件冒泡(兼容IE、Chrome、FF)
			这里仅仅是一个简单代码demo,因为时间问题并未做深入研究,因为今天做项目时要用到阻止事件冒泡的内容,找了好多才找到一个可以使用的,特记录之. <!DOCTYPE HTML> <ht ... 
- asp.net下cookie 的基础使用
			cookie作为在B/S开发中经常被使用到的东西,asp.net必然提供了现成的东西给我们使用. 就是这个对象:HttpCookie,当然了,对于asp.net来说,Request和Response中 ... 
- java线程API学习 线程池ThreadPoolExecutor(转)
			线程池ThreadPoolExecutor继承自ExecutorService.是jdk1.5加入的新特性,将提交执行的任务在内部线程池中的可用线程中执行. 构造函数 ThreadPoolExecut ... 
- Codeforces 135A-Replacement(思维)
			A. Replacement time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ... 
- 大数据系列修炼-Scala课程11
			接着昨天的list,也是学习集合的相关知识 ListBuffer.ArrayBuffer.Queue.stack相关操作 1.ListBuffer.ArrayBuffer代码实现:ListBuffer ... 
