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

SpringBoot如何使用注解進(jìn)行XSS防御

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

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

引入相關(guān)依賴

maven依賴:

<!--JSR-303/JSR-380用于驗(yàn)證的注解 -->
<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注解進(jìn)行參數(shù)校驗(yàn)

我們可以自定義一個(gè)@XSS注解,用于標(biāo)記那些需要校驗(yàn)的參數(shù)。這里是一個(gè)簡單的@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 {};
}

實(shí)現(xiàn)自定義注解處理器

接下來,我們需要實(shí)現(xiàn)XSSValidator類,該類將負(fù)責(zé)檢查輸入是否包含潛在的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注解校驗(yàn)
 */
public class XssValidator implements ConstraintValidator<Xss, String> {
    /**
     * 使用jsoup自帶的relaxed白名單
     */
    private static final Whitelist WHITE_LIST = Whitelist.relaxed();
    /**
     * 定義輸出設(shè)置,關(guān)閉prettyPrint(prettyPrint=false),目的是避免在清理過程中對代碼進(jìn)行格式化
     * 從而保持輸入和輸出內(nèi)容的一致性。
     */
    private static final Document.OutputSettings OUTPUT_SETTINGS = new Document.OutputSettings().prettyPrint(false);
    /**
     * 驗(yàn)證輸入值是否有效,即是否包含潛在的XSS攻擊腳本。
     * 
     * @param value 輸入值,需要進(jìn)行XSS攻擊腳本清理。
     * @param context 上下文對象,提供關(guān)于驗(yàn)證環(huán)境的信息,如驗(yàn)證失敗時(shí)的錯誤消息定制。
     * @return 如果清理后的值與原始值相同,則返回true,表示輸入值有效;否則返回false,表示輸入值無效。
     */
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // 這里先對value進(jìn)行一次解析,對其中的單個(gè)<、>字符進(jìn)行編碼
        String oldBody = Jsoup.parse(value).body().html();
        // 使用Jsoup庫對輸入值進(jìn)行清理,以移除潛在的XSS攻擊腳本。
        // 使用預(yù)定義的白名單和輸出設(shè)置來確保只保留安全的HTML元素和屬性。
        String newBody = Jsoup.clean(value, "", WHITE_LIST, OUTPUT_SETTINGS);
        // 比較清理后的值與解析后的值是否相同,不相同說明過濾了xss腳本
        // 這里不使用value與newBody比,因?yàn)閖soup會對value中的單個(gè)<、>字符進(jìn)行編碼,如果value中還有單個(gè)的<,value與newBody也會不一樣
        return oldBody.equals(newBody);
    }
}

使用@Xss注解防御post請求

如果是post請求,需要在方法參數(shù)前面加上@Valid或者@Validated注解,然后在實(shí)體類的屬性上面加上@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,在實(shí)體類需要攔截xss的屬性上面加上@Xss或者@Validated注解
     *
     * @param userLocalLoginPojo 實(shí)體類
     * @return 實(shí)體類
     */
    @PostMapping("/test")
    public UserLocalLoginPojo test(@Valid @RequestBody UserLocalLoginPojo userLocalLoginPojo) {
        return userLocalLoginPojo;
    }
}

在要進(jìn)行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>"
}

測試結(jié)果:

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

使用@Xss注解防御get請求

如果是get請求,需要在方法參數(shù)前面加上@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,在方法參數(shù)前面加上@Xss,注意類上面要加上@Validated注解
     *
     * @param userAccount 請求參數(shù)
     * @return 請求參數(shù)
     */
    @GetMapping("/test")
    public String test(@Xss String userAccount) {
        return userAccount;
    }
}

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

測試結(jié)果:

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

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

相關(guān)文章

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

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

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

    Spring一步到位精通攔截器

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

    SpringBoot實(shí)現(xiàn)公共字段自動填充的方法步驟

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

    一文帶你吃透Java中的String類

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

    SpringBoot整合ES高級查詢方式

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

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

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

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

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

    java DateUtil工具類時(shí)間戳類型轉(zhuǎn)換詳解

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

    深入理解ContextClassLoader加載器

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

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

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

最新評論

光山县| 广东省| 抚远县| 高碑店市| 义乌市| 瓦房店市| 女性| 沁源县| 武胜县| 西畴县| 门头沟区| 时尚| 托克逊县| 静乐县| 彰武县| 水富县| 荔浦县| 尤溪县| 渭源县| 遂宁市| 东至县| 蓝田县| 新乡县| 津南区| 韶山市| 澎湖县| 山东省| 湖口县| 久治县| 齐齐哈尔市| 马龙县| 礼泉县| 敖汉旗| 海兴县| 博野县| 如皋市| 横山县| 蓬安县| 深水埗区| 开封市| 夹江县|