Java过滤器如何解决存储型xss攻击问题

 更新时间:2024年05月27日 10:48:02   作者:冯浩月  
这篇文章主要介绍了Java过滤器如何解决存储型xss攻击问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Java过滤器解决存储型xss攻击

XSS攻击场景

攻击者可以通过构造URL注入JavaScript、VBScript、ActiveX、HTML或者Flash的手段,利用跨站脚本漏洞欺骗用户,收集Cookie等相关数据并冒充其他用户。

通过精心构造的恶意代码,可以让访问者访问非法网站或下载恶意木马,如果再结合其他攻击手段(如社会工程学、提权等),甚至可以获取系统的管理权限。

举例说明

例如:

在项目看板里待材料初审存储下面代码,点击A项目会弹出框

Payload: <iframe οnlοad=alert("xss");></iframe>

在这里插入图片描述

例如:

全部阶段结果标准-存储下面代码,点击20200927测试-2

Payload: <textarea οnfοcus=alert("xss"); autofocus>

在这里插入图片描述

解决方案

找到项目已有的filter过滤器,在过滤HttpServletRequest参数时,进行参数的处理,使用转义,将 < 转义为 & lt , > 转义为 & gt

  public PaasHttpRequestWrapper(HttpServletRequest request) {
        super(request);
        StringBuilder stringBuilder = new StringBuilder();
        InputStream inputStream = null;
        try {
            inputStream = request.getInputStream();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        if (inputStream != null) {
            try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) {
                char[] charBuffer = new char[CHAR_BUFFER_LENGTH];
                int bytesRead;
                while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                    stringBuilder.append(charBuffer, BUFFER_START_POSITION, bytesRead);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            stringBuilder.append("");
        }
        body = stringBuilder.toString();
        // 解决xss攻击问题
        if (body.contains("<")) {
            body = body.replace("<", "&lt");
        }
        if (body.contains(">")) {
            body = body.replace(">", "&gt");
        }
        initParameterMap();
    }

XSS攻击及解决方案

什么是XSS攻击?

XSS攻击使用Javascript脚本注入进行攻击

XSS攻击常出现在提交表单中,如博客的评论区等,用户可以通过提交评论:<script>alert("你的网站太垃圾了!")</script>,那么只要访问该页面的用户都会弹窗,当然,这可能是为了娱乐娱乐,不要小看XSS攻击,有些人利用XSS攻击窃取用户名密码,调用黑客的工程,将用户名和密码发送过去,也可以伪装成钓鱼网站。

例如在表单中注入: <script>location.href='http://www.xxx.com'</script> 那么页面会跳转到xxx.com

还可以根据js获取本地浏览器的cookie信息,根据cookie信息完全可以模拟用户。

注意:谷歌浏览器 已经防止了XSS攻击,为了演示效果,最好使用火狐浏览器。

那么该如何防止XSS攻击呢?

实现思路:

使用转义解决。将<转义为&lt    >转义为&gt

  • ①使用过滤器,拦截所有请求,重写request
  • ②重写获取值的方法,将特殊代码转换成html

具体代码实现:

  • XssHttpServletRequest.java
package cn.itcats;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
 
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
 
public class XssHttpServletRequest extends HttpServletRequestWrapper{
    private HttpServletRequest request;
    
    //需要重写构造方法
    public XssHttpServletRequest(HttpServletRequest request) {
        super(request);
        this.request = request;
    }
        
    //需要重写getParameter(name)方法,将value进行转义
    public String getParameter(String name) {
        String value = request.getParameter(name);
        System.out.println("没有转义之前:value="+value);
        if(StringUtils.isNotBlank(value)){
            //转化为html,<script>标签都会转化为html格式  &lt;script&gt;
            //工具类来自于org.apache.commons.lang3.StringEscapeUtils
            value = StringEscapeUtils.escapeHtml4(value);
        }
        return value;
    }
 
}
  • web.xml配置过滤器
<!-- 防止XSS攻击 -->
    <filter>
        <filter-name>FilterXSS</filter-name>
        <filter-class>cn.itcats.FilterXSS</filter-class>
    </filter>
    
    <filter-mapping>
        <filter-name>FilterXSS</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

  • FilterXss.java
package cn.itcats;
 
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 FilterXSS implements Filter{
 
    public void init(FilterConfig filterConfig) throws ServletException {
        
    }
 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        //强转为HttpServletRequest
        HttpServletRequest req = (HttpServletRequest)request;
        //需要重写request,重建一个类XssHttpServletRequest 继承 HttpServletRequestWrapper,重写构造和getParameter方法
        XssHttpServletRequest xssHttpServletRequest = new XssHttpServletRequest(req);
        //务必传入是重写过的request,放行
        chain.doFilter(xssHttpServletRequest, response);
    }
 
    public void destroy() {
        
    }
 
}

注意:只要是文本框、表单等,需要提交并在页面展示的,一般都需要做防XSS攻击。 

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • JAVA swing布局管理器实例解析

    JAVA swing布局管理器实例解析

    这篇文章主要介绍了JAVA swing布局管理器实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 一次Spring项目打包问题排查的实战记录

    一次Spring项目打包问题排查的实战记录

    这篇文章主要给大家介绍了一次Spring项目打包问题排查的实战记录,文中通过示例代码介绍的非常详细,对大家的学习或者使用Spring具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-08-08
  • Java中的接口和抽象类用法实例详解

    Java中的接口和抽象类用法实例详解

    这篇文章主要介绍了Java中的接口和抽象类用法,结合实例形式较为详细的分析了Java中关于接口和抽象类的概念、定义、用法与相关注意事项,需要的朋友可以参考下
    2015-12-12
  • SpringBoot热部署启动关闭流程详解

    SpringBoot热部署启动关闭流程详解

    Spring Boot启动热部署是一种技术,它能让开发者在不重启应用程序的情况下实时更新代码。这样可以提高开发效率,避免频繁重启应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-04-04
  • 浅谈Java面向接口编程

    浅谈Java面向接口编程

    本文通过结合接口的本质、面向对象编程与面向接口编程的关系以及一些作者自身的理解,向大家介绍了面向接口编程的一些东西,需要的朋友可以了解下。
    2017-09-09
  • Java实现的决策树算法完整实例

    Java实现的决策树算法完整实例

    这篇文章主要介绍了Java实现的决策树算法,简单描述了决策树的概念、原理,并结合完整实例形式分析了java实现决策树算法的相关操作技巧,代码中备有较为详尽的注释便于理解,需要的朋友可以参考下
    2017-11-11
  • 了解Java虚拟机JVM的基本结构及JVM的内存溢出方式

    了解Java虚拟机JVM的基本结构及JVM的内存溢出方式

    这篇文章主要介绍了Java虚拟机JVM的基本结构及JVM的内存溢出方式,涉及到Java内存分配相关方面的知识,需要的朋友可以参考下
    2016-01-01
  • SpringBoot整合jasypt实现重要数据加密

    SpringBoot整合jasypt实现重要数据加密

    Jasypt是一个专注于简化Java加密操作的开源工具,这篇文章主要为大家介绍了详细介绍了如何使用jasypt实现重要数据加密,感兴趣的小伙伴可以了解下
    2025-03-03
  • Java前端Layer.open.btn验证无效解决方法

    Java前端Layer.open.btn验证无效解决方法

    在本篇文章里我们给大家整理了一篇关于Java前端Layer.open.btn验证无效解决方法以及实例代码,需要的朋友们可以参考学习下。
    2019-09-09
  • Java Yml格式转换为Properties问题

    Java Yml格式转换为Properties问题

    本文介绍了作者编写一个Java工具类来解决在线YAML到Properties转换时属性内容遗漏的问题,通过遍历YAML文件的树结构,作者成功实现了属性的完整转换,总结指出,该工具类适用于多种数据类型,并且代码简洁易懂
    2024-12-12

最新评论