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应用注册成Windows服务实现自启的教程详解

    Java应用注册成Windows服务实现自启的教程详解

    这篇文章主要给大家介绍了Java应用注册成Windows服务实现自启的教程,文中有详细的代码示例和图文讲解供大家参考,具有一定的参考价值,需要的朋友可以参考下
    2024-02-02
  • Spring Cloud 网关服务 zuul  动态路由的实现方法

    Spring Cloud 网关服务 zuul 动态路由的实现方法

    网关服务是流量的唯一入口。不能随便停服务。所以动态路由就显得尤为必要。这篇文章主要介绍了Spring Cloud 网关服务 zuul 三 动态路由的相关知识,需要的朋友可以参考下
    2019-10-10
  • java实现ATM机系统(2.0版)

    java实现ATM机系统(2.0版)

    这篇文章主要为大家详细介绍了java实现ATM机系统2.0版,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • Maven Assembly实战教程

    Maven Assembly实战教程

    MavenAssembly插件用于创建可分发包,如JAR、ZIP或TAR文件,通过配置pom.xml,可以生成包含所有依赖的JAR文件或自定义格式的归档文件,示例展示了如何使用默认描述符和自定义描述符创建JAR包,以及在多模块项目中使用Assembly插件
    2024-12-12
  • java外部类与内部类简介

    java外部类与内部类简介

    这篇文章简单介绍了java外部类与内部类,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • 使用Java实现裁剪和压缩PPT中的图片

    使用Java实现裁剪和压缩PPT中的图片

    在工作中,PPT演示文稿广泛应用于报告、课程内容展示以及项目计划,然而,当 PPT 文件中包含大量图片时,文件大小常常大幅增加,导致加载缓慢、分享困难等问题,因此在这篇文章中,我们将详细介绍如何使用Java实现裁剪和压缩PPT中的图片,需要的朋友可以参考下
    2026-03-03
  • Java使用DateTimeFormatter实现格式化时间

    Java使用DateTimeFormatter实现格式化时间

    这篇文章主要介绍了Java使用DateTimeFormatter实现格式化时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • 详解Spring Bean的配置方式与实例化

    详解Spring Bean的配置方式与实例化

    本文主要带大家一起学习一下Spring Bean的配置方式与实例化,文中的示例代码讲解详细,对我们学习Spring有一定的帮助,需要的可以参考一下
    2022-06-06
  • Maven生命周期和及插件原理用法详解

    Maven生命周期和及插件原理用法详解

    这篇文章主要介绍了Maven生命周期和及插件原理用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值的相关资料
    2020-08-08
  • Mybatis分页的4种方式实例

    Mybatis分页的4种方式实例

    这篇文章主要介绍了Mybatis分页的4种方式实例,包括数组分页,sql分页,拦截器分页,RowBounds分页,需要的朋友可以参考下
    2022-04-04

最新评论