首页 文章 精选 留言 我的

精选列表

搜索[主题包插件],共10000篇文章
优秀的个人博客,低调大师

Spring Boot XSS 攻击过滤插件使用

XSS 是什么 XSS(Cross Site Scripting)攻击全称跨站脚本攻击,为了不与 CSS(Cascading Style Sheets)名词混淆,故将跨站脚本攻击简称为 XSS,XSS 是一种常见 web 安全漏洞,它允许恶意代码植入到提供给其它用户使用的页面中。 xss 攻击流程 简单 xss 攻击示例 若网站某个表单没做相关的处理,用户提交相关恶意代码,浏览器会执行相关的代码。 解决方案 XSS 过滤说明 对表单绑定的字符串类型进行 xss 处理。 对 json 字符串数据进行 xss 处理。 提供路由和控制器方法级别的放行规则。 使用 mica-xss 引入一下 依赖即可 <!--XSS 安全过滤--> <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> 测试 XSS 过滤 测试 GET 参数过滤 创建目标接口,模拟 get 提交 @GetMapping("/xss") public String xss(String params){ return params; } 返回为空 ⋊> ~ curl --location --request GET 'http://localhost:8080/xss?params=%3Cscript%3Ealert(%27xxx%27)%3C/script%3E' 测试 POST form 参数过滤 创建目标接口,模拟 post form 提交 @PostMapping("/xss") public String xss(String params){ return params; } 返回为空 curl --location --request POST 'http://localhost:8080/xss' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-urlencode 'params=<script>alert('\''xxx'\'')</script>' 测试 POST body 参数过滤 创建目标接口,模拟 post body 提交 @PostMapping("/xss") public String xss(@RequestBody Map<String,String> body){ return body.get("params"); } 返回为空 curl --location --request POST 'http://localhost:8080/xss' \ --header 'Content-Type: application/json' \ --data-raw '{ "params":"<script>alert('\''XXX'\'')</script>" }' 跳过某些接口过滤 可以使用 @XssCleanIgnore 注解对方法和类级别进行忽略。 @XssCleanIgnore @PostMapping("/xss") public String xss(@RequestBody Map<String,String> body){ return body.get("params"); } 原理分析 常见实现剖析 目前网上大多数的方案如下图,新增 XssFilter 拦截用户提交的参数,进行相关的转义和黑名单排除,完成相关的业务逻辑。在整个过程中最核心的是通过包装用户的原始请求,创建新的 requestwrapper 保证请求流在后边的流程可以重复读。 <img src="https://i.loli.net/2020/12/01/DN4XUGi1rxSRath.png" style="zoom:67%;" /> mica-xss 实现 1. 自定义 WebDataBinder 编辑器支持 form 过滤 Spring WebDataBinder 的作用是从 web request 中把 web 请求里的parameters绑定到对应的JavaBean上,在 Controller 方法中的参数类型可以是基本类型,也可以是封装后的普通 Java 类型。若这个普通的 Java 类型没有声明任何注解,则意味着它的每一个属性都需要到 Request 中去查找对应的请求参数,而 WebDataBinder 则可以帮助我们实现从 Request 中取出请求参数并绑定到 JavaBean 中。 SpringMVC 在绑定的过程中提供了用户自定义编辑绑定的接口,注入即可在参数绑定 JavaBean 过程中执行过滤。 2. 自定义 JsonDeserializer 反序列化支持 Json 过滤 在 Spring Boot 中默认是使用 Jackson 进行序列化和反序列化 JSON 数据的,那么除了可以用默认的之外,我们也可以编写自己的 JsonSerializer 和 JsonDeserializer 类,来进行自定义操作。用户提交 JSON 报文会通过 Jackson 的 JsonDeserializer 绑定到 JavaBean 中。我们只需要自定义 JsonDeserializer 即可完成在绑定 JavaBean 中执行过滤。 核心过滤逻辑 在 mica-xss 中并未采取上文所述通过自己手写黑名单或者转义方式的实现方案,而是直接实现 Jsoup 这个工具类。 jsoup 实现 WHATWG HTML5 规范,并将 HTML 解析为与现代浏览器相同的 DOM。 从 URL,文件或字符串中刮取和解析 HTML 使用 DOM 遍历或 CSS 选择器查找和提取数据 操纵 HTML 元素,属性和文本 清除用户提交的内容以防止安全白名单,以防止 XSS 攻击 输出整洁的 HTML 项目推荐: Spring Cloud 、Spring Security OAuth2的RBAC权限管理系统 欢迎关注

优秀的个人博客,低调大师

Spring Boot 接口幂等插件使用

幂等概述 幂等性原本是数学上的概念,即使公式:f(x)=f(f(x)) 能够成立的数学性质。用在编程领域,则意为对同一个系统,使用同样的条件,一次请求和重复的多次请求对系统资源的影响是一致的。 幂等性是分布式系统设计中十分重要的概念,具有这一性质的接口在设计时总是秉持这样的一种理念:调用接口发生异常并且重复尝试时,总是会造成系统所无法承受的损失,所以必须阻止这种现象的发生。 实现幂等的方式很多,目前基于请求令牌机制适用范围较广。其核心思想是为每一次操作生成一个唯一性的凭证,也就是 token。一个 token 在操作的每一个阶段只有一次执行权,一旦执行成功则保存执行结果。对重复的请求,返回同一个结果(报错)等。参考《幂等性浅谈》 幂等处理实现 加入依赖 <dependency> <groupId>com.pig4cloud.plugin</groupId> <artifactId>idempotent-spring-boot-starter</artifactId> <version>0.0.1</version> </dependency> 配置 Redis 链接 默认情况下,可以不配置。理论是支持 redisson-spring-boot-starter 全部配置 spring: redis: host: 127.0.0.1 port: 6379 接口 @Idempotent(key = "#key", expireTime = 10, info = "请勿重复查询") @GetMapping("/test") public String test(String key) { return "success"; } 测试 10 个独立线程请求 执行查看结果,10 个请求只会有一个成功 查看后台异常报错,9 个异常报错满足预期 idempotent 注解说明 key: 幂等操作的唯一标识,使用 spring el 表达式 用#来引用方法参数 。 可为空则取当前 url + args 做请求的唯一标识 expireTime: 有效期 默认:1 有效期要大于程序执行时间,否则请求还是可能会进来 timeUnit: 时间单位 默认:s (秒) info: 幂等失败提示信息,可自定义 delKey: 是否在业务完成后删除 key true:删除 false:不删除 幂等处理设计原理 流程设计参考 1.请求开始前,根据 key 查询 查到结果:报错 未查到结果:存入 key-value-expireTime key=ip+url+args 2.请求结束后,直接删除 key 不管 key 是否存在,直接删除 是否删除,可配置 3.expireTime 过期时间,防止一个请求卡死,会一直阻塞,超过过期时间,自动删除 过期时间要大于业务执行时间,需要大概评估下; 4.此方案直接切的是接口请求层面。 5.过期时间需要大于业务执行时间,否则业务请求 1 进来还在执行中,前端未做遮罩,或者用户跳转页面后再回来做重复请求 2,在业务层面上看,结果依旧是不符合预期的。 6.建议 delKey = false。即使业务执行完,也不删除 key,强制锁 expireTime 的时间。预防 5 的情况发生。 7.实现思路:同一个请求 ip 和接口,相同参数的请求,在 expireTime 内多次请求,只允许成功一次。 8.页面做遮罩,数据库层面的唯一索引,先查询再添加,等处理方式应该都处理下。 9.此注解只用于幂等,不用于锁,100 个并发这种压测,会出现问题,在这种场景下也没有意义,实际中用户也不会出现 1s 或者 3s 内手动发送了 50 个或者 100 个重复请求,或者弱网下有 100 个重复请求; 总结 pig-mesh/pig pig-mesh/idempotent-spring-boot-starter 项目推荐: Spring Cloud 、Spring Security OAuth2的RBAC权限管理系统 欢迎关注

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册