最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot如何使用注解進行XSS防御

 更新時間:2024年11月07日 11:20:42   作者:morris131  
在SpringBoot中,可以通過自定義@XSS注解和實現XSSValidator類來防御XSS攻擊,此方法適用于GET和POST請求,通過在方法參數或實體類屬性上添加@XSS注解,并結合@Valid或@Validated注解使用,有效攔截潛在的XSS腳本,保障應用安全

在Spring Boot中,我們可以使用注解的方式來進行XSS防御。注解是一種輕量級的防御手段,它可以在方法或字段級別對輸入進行校驗,從而防止XSS攻擊。

引入相關依賴

maven依賴:

<!--JSR-303/JSR-380用于驗證的注解 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
    <version>2.6.7</version>
</dependency>

如果是使用grade,引入依賴:

implementation 'org.springframework.boot:spring-boot-starter-validation:2.6.7'

定義@XSS注解進行參數校驗

我們可以自定義一個@XSS注解,用于標記那些需要校驗的參數。這里是一個簡單的@XSS注解定義:

package com.morris.spring.boot.module.xss;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@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 {};
}

實現自定義注解處理器

接下來,我們需要實現XSSValidator類,該類將負責檢查輸入是否包含潛在的XSS攻擊腳本:

package com.morris.spring.boot.module.xss;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.safety.Whitelist;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
/**
 * xss注解校驗
 */
public class XssValidator implements ConstraintValidator<Xss, String> {
    /**
     * 使用jsoup自帶的relaxed白名單
     */
    private static final Whitelist WHITE_LIST = Whitelist.relaxed();
    /**
     * 定義輸出設置,關閉prettyPrint(prettyPrint=false),目的是避免在清理過程中對代碼進行格式化
     * 從而保持輸入和輸出內容的一致性。
     */
    private static final Document.OutputSettings OUTPUT_SETTINGS = new Document.OutputSettings().prettyPrint(false);
    /**
     * 驗證輸入值是否有效,即是否包含潛在的XSS攻擊腳本。
     * 
     * @param value 輸入值,需要進行XSS攻擊腳本清理。
     * @param context 上下文對象,提供關于驗證環(huán)境的信息,如驗證失敗時的錯誤消息定制。
     * @return 如果清理后的值與原始值相同,則返回true,表示輸入值有效;否則返回false,表示輸入值無效。
     */
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // 這里先對value進行一次解析,對其中的單個<、>字符進行編碼
        String oldBody = Jsoup.parse(value).body().html();
        // 使用Jsoup庫對輸入值進行清理,以移除潛在的XSS攻擊腳本。
        // 使用預定義的白名單和輸出設置來確保只保留安全的HTML元素和屬性。
        String newBody = Jsoup.clean(value, "", WHITE_LIST, OUTPUT_SETTINGS);
        // 比較清理后的值與解析后的值是否相同,不相同說明過濾了xss腳本
        // 這里不使用value與newBody比,因為jsoup會對value中的單個<、>字符進行編碼,如果value中還有單個的<,value與newBody也會不一樣
        return oldBody.equals(newBody);
    }
}

使用@Xss注解防御post請求

如果是post請求,需要在方法參數前面加上@Valid或者@Validated注解,然后在實體類的屬性上面加上@Xss注解。

package com.morris.spring.boot.module.xss;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
/**
 * Xss局部防御post請求
 */
@RestController
@RequestMapping("/xss/local")
public class XssLocalPostController {
    /**
     * 使用注解攔截POST請求中的xss,在實體類需要攔截xss的屬性上面加上@Xss或者@Validated注解
     *
     * @param userLocalLoginPojo 實體類
     * @return 實體類
     */
    @PostMapping("/test")
    public UserLocalLoginPojo test(@Valid @RequestBody UserLocalLoginPojo userLocalLoginPojo) {
        return userLocalLoginPojo;
    }
}

在要進行XSS防御的屬性上添加@Xss注解:

package com.morris.spring.boot.module.xss;
import lombok.Data;
@Data
public class UserLocalLoginPojo {
    @Xss
    private String userAccount;
}

測試url:http://localhost:8888/xss/local/test

測試post請求:

{
    "userAccount": "<iframe οnlοad='alert(0)'>demoData</iframe>"
}

測試結果:

{
    "message": "userAccount:非法輸入, 檢測到潛在的XSS",
    "code": 400,
    "result": null
}

使用@Xss注解防御get請求

如果是get請求,需要在方法參數前面加上@Xss注解,然后在類上加上@Validated注解。

package com.morris.spring.boot.module.xss;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
 * Xss局部防御get請求
 */
@RestController
@RequestMapping("/xss/local")
@Validated
public class XssLocalGetController {
    /**
     * 使用注解攔截get請求中的xss,在方法參數前面加上@Xss,注意類上面要加上@Validated注解
     *
     * @param userAccount 請求參數
     * @return 請求參數
     */
    @GetMapping("/test")
    public String test(@Xss String userAccount) {
        return userAccount;
    }
}

測試url:http://localhost:8888/xss/local/test?userAccount=<iframe>demoData</iframe>

測試結果:

{
    "message": "test.userAccount: 非法輸入, 檢測到潛在的XSS",
    "code": 400,
    "result": null
}

到此這篇關于SpringBoot使用注解進行XSS防御的文章就介紹到這了,更多相關SpringBoot XSS防御內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java中Boolean和boolean的區(qū)別詳析

    Java中Boolean和boolean的區(qū)別詳析

    boolean是基本數據類型Boolean是它的封裝類,和其他類一樣,有屬性有方法,可以new,下面這篇文章主要給大家介紹了關于Java中Boolean和boolean區(qū)別的相關資料,需要的朋友可以參考下
    2022-07-07
  • Spring一步到位精通攔截器

    Spring一步到位精通攔截器

    攔截器(Interceptor)是一種動態(tài)攔截方法調用的機制,在SpringMVC中動態(tài)攔截控制器方法的執(zhí)行。本文將詳細講講SpringMVC中攔截器的概念及入門案例,感興趣的可以嘗試一下
    2023-01-01
  • SpringBoot實現公共字段自動填充的方法步驟

    SpringBoot實現公共字段自動填充的方法步驟

    這篇文章主要介紹了SpringBoot實現公共字段自動填充的方法步驟,文中通過代碼示例講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-11-11
  • 一文帶你吃透Java中的String類

    一文帶你吃透Java中的String類

    在 Java 中,字符串是一種常見的數據類型,經常用于存儲一些文本信息,而String類則是Java提供的專門用于字符串操作的類,本文就來和大家聊聊String類的常用方法與實現原理吧
    2023-05-05
  • SpringBoot整合ES高級查詢方式

    SpringBoot整合ES高級查詢方式

    這篇文章主要介紹了SpringBoot整合ES高級查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • spring boot 2整合swagger-ui過程解析

    spring boot 2整合swagger-ui過程解析

    這篇文章主要介紹了spring boot 2整合swagger-ui過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • mybatis 集合嵌套查詢和集合嵌套結果的區(qū)別說明

    mybatis 集合嵌套查詢和集合嵌套結果的區(qū)別說明

    這篇文章主要介紹了mybatis 集合嵌套查詢和集合嵌套結果的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • java DateUtil工具類時間戳類型轉換詳解

    java DateUtil工具類時間戳類型轉換詳解

    這篇文章主要為大家詳細介紹了java DateUtil工具類時間戳類型轉換的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • 深入理解ContextClassLoader加載器

    深入理解ContextClassLoader加載器

    這篇文章主要介紹了深入理解ContextClassLoader加載器,Thread?context?class?loader存在的目的主要是為了解決parent?delegation機制下無法干凈的解決的問題,需要的朋友可以參考下
    2023-10-10
  • MyBatis-Plus之select、delete用法及說明

    MyBatis-Plus之select、delete用法及說明

    文章主要講解了Mybatis-Plus中的查詢和刪除操作,查詢操作包括根據ID、批量和使用map進行條件查詢,以及內置分頁插件的使用,刪除操作則包括物理刪除和邏輯刪除,其中邏輯刪除需要在數據庫和實體類中進行相關配置
    2026-04-04

最新評論

桐梓县| 湘潭县| 封丘县| 万山特区| 喀喇| 黄骅市| 鹿邑县| 和田县| 五大连池市| 梁山县| 伊金霍洛旗| 兴隆县| 龙山县| 白水县| 卓资县| 武陟县| 桑植县| 城步| 襄垣县| 峡江县| 自治县| 乌鲁木齐县| 广德县| 阿荣旗| 伊宁县| 安陆市| 嘉定区| 富宁县| 翁牛特旗| 临澧县| 桃江县| 海晏县| 定远县| 贡觉县| 观塘区| 民和| 崇文区| 商水县| 鹤岗市| 三原县| 沙田区|