SpringBoot配置XSS过滤器基于mica-xss

本文介绍了如何在SpringBoot项目中集成mica-xss来防御XSS攻击。首先,解释了XSS攻击的概念及其危害,然后详细说明了mica框架的特点和版本信息。接着,展示了如何添加mica-xss的maven依赖,并通过代码实例演示了如何在 UserController 中使用@XssCleanIgnore注解实现XSS过滤。最后,提供了测试验证的方法,证明了注解能有效防止XSS攻击。
摘要由CSDN通过智能技术生成

1. 业务概述

1.1 XSS简介

XSS攻击即跨站点脚本攻击(Cross Site Script),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。通俗的讲就是通过web应用可输入参数,输入script脚本实现xss攻击。主要防御措施是通过web页面关键字特殊字符过滤。

常见网络攻击详解:https://blog.csdn.net/m0_37583655/article/details/123948614

1.2 需求概述

在常见的开发中需要注意xss跨站脚本的攻击,需要对参数关键字做一些校验与过滤,避免将script脚本存入数据库或者造成数据泄漏等安全问题,mica则是常见的开发工具包,其提供的xss功能可以解决该问题,避免xss攻击,当然方式有很多,通过jsonp或者过滤器也可以实现,为了避免重复造轮子,这里采用mica-xss方式实现。

2. mica概述

2.1 mica简介

Mica,Spring Cloud 微服务开发核心包,支持 web 和 webflux。

2.1 mica对应springboot版本信息

最新版本mica版本spring boot 版本spring cloud 版本
2.6.6mica 2.6.x2.6.x2021
2.5.8mica 2.5.x2.5.x2020
2.4.11mica 2.4.x2.4.x2020
2.1.1-GAmica 2.0.x~2.1.x2.2.x ~ 2.3.xHoxton

2.2 mica核心功能

mica-auto (Spring boot starter 利器): https://gitee.com/596392912/mica-auto
mica-weixin(jfinal weixin 的 spring boot starter): https://gitee.com/596392912/mica-weixin
mica-mqtt(基于 t-io 实现的 mqtt组件): https://gitee.com/596392912/mica-mqtt
Spring cloud 微服务 http2 方案(h2c): https://gitee.com/596392912/spring-cloud-java11
mica-security(mica权限系统 vue 改造中): https://gitee.com/596392912/mica-security

在这里插入图片描述

2.3 mica协议文档

mica采用LGPL(GNU Lesser General Public License)协议。

LGPL 是 GPL 的一个为主要为类库使用设计的开源协议。和 GPL 要求任何使用/修改/衍生之 GPL 类库的的软件必须采用 GPL 协议不同。LGPL 允许商业软件通过类库引用(link)方式使用 LGPL 类库而不需要开源商业软件的代码。这使得采用 LGPL 协议的开源代码可以被商业软件作为类库引用并发布和销售。

但是如果修改 LGPL 协议的代码或者衍生,则所有修改的代码,涉及修改部分的额外代码和衍生的代码都必须采用 LGPL 协议。因此 LGPL 协议的开源代码很适合作为第三方类库被商业软件引用,但不适合希望以 LGPL 协议代码为基础,通过修改和衍生的方式做二次开发的商业软件采用。

mica相关文档
mica 源码 Github:https://github.com/lets-mica
mica 源码 Gitee(码云):https://gitee.com/596392912/mica
mica 性能压测:https://github.com/lets-mica/mica-jmh
文档地址(官网):http://wiki.dreamlu.net
文档地址(语雀-可关注订阅):https://www.yuque.com/dreamlu

mica gitee:https://gitee.com/596392912/mica
mica2.x使用文档:https://www.dreamlu.net/mica2x/index.html
跨站点脚本编制 - SpringBoot配置XSS过滤器(基于mica-xss):https://www.cnblogs.com/cao-lei/p/14101782.html

3. SpringBoot集成mica-xss

3.1 maven依赖

<dependency>
	<groupId>net.dreamlu</groupId>
	<artifactId>mica-core</artifactId>
	<version>2.0.9-GA</version>
</dependency>
<dependency>
	<groupId>net.dreamlu</groupId>
	<artifactId>mica-xss</artifactId>
	<version>2.0.9-GA</version>
</dependency>

3.2 代码实现

UserController

package com.zrj.flowable.controller;

import com.zrj.flowable.entity.UserEntity;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import net.dreamlu.mica.xss.core.XssCleanIgnore;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 用户控制器
 *
 * @author zrj
 * @since 2022/4/4
 **/
@Slf4j
@RestController
@RequestMapping(value = "user")
@Api(tags = "UserController", description = "用户控制器")
public class UserController {

    /**
     * 获取用户信息
     * 当参数username=<script>alert(666)</script>
     * 接收不到username参数,username=null
     *
     * @param user 用户对象
     * @return
     */
    @GetMapping("/get")
    @ApiOperation("普通方式,获取用户信息")
    public String get(UserEntity user) {
        log.info("【普通方式】获取用户信息,user:{}", user);
        return user.toString();
    }

    /**
     * 获取用户名称
     * 不会把参数username=<script>alert(666)</script>过滤掉
     *
     * @param username 用户名称
     * @return
     */
    @GetMapping("/getUserName")
    @ApiOperation("普通方式,获取用户名称")
    public String getUserName(String username) {
        log.info("【普通方式】获取用户名称,username:{}", username);
        return username;
    }

    /**
     * 获取用户名称
     * 跳过过滤, 在Controller或者方法上添加注解@XssCleanIgnore。
     * 会把参数username=<script>alert(666)</script>过滤掉
     *
     * @param username 用户名称
     * @return
     */
    @XssCleanIgnore
    @GetMapping("/getRegisterUserName")
    @ApiOperation("过滤方式,获取用户名称")
    public String getRegisterUserName(String username) {
        log.info("【过滤方式】获取用户名称,username:{}", username);
        return username;
    }

}

UserEntity

package com.zrj.flowable.entity;

import lombok.Data;

/**
 * @author zrj
 * @since 2022/4/4
 **/
@Data
public class UserEntity {
    /**
     * 用户ID
     */
    private String id;

    /**
     * 用户名称
     */
    private String username;
}

3.3 测试验证

xss防御主要是通过@XssCleanIgnore注解实现。正常请求不会把参数username=。
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值