亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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í)的防御手段,它可以在方法或字段級(jí)別對(duì)輸入進(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),目的是避免在清理過程中對(duì)代碼進(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 上下文對(duì)象,提供關(guān)于驗(yàn)證環(huán)境的信息,如驗(yàn)證失敗時(shí)的錯(cuò)誤消息定制。
     * @return 如果清理后的值與原始值相同,則返回true,表示輸入值有效;否則返回false,表示輸入值無效。
     */
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // 這里先對(duì)value進(jìn)行一次解析,對(duì)其中的單個(gè)<、>字符進(jìn)行編碼
        String oldBody = Jsoup.parse(value).body().html();
        // 使用Jsoup庫對(duì)輸入值進(jìn)行清理,以移除潛在的XSS攻擊腳本。
        // 使用預(yù)定義的白名單和輸出設(shè)置來確保只保留安全的HTML元素和屬性。
        String newBody = Jsoup.clean(value, "", WHITE_LIST, OUTPUT_SETTINGS);
        // 比較清理后的值與解析后的值是否相同,不相同說明過濾了xss腳本
        // 這里不使用value與newBody比,因?yàn)閖soup會(huì)對(duì)value中的單個(gè)<、>字符進(jìn)行編碼,如果value中還有單個(gè)的<,value與newBody也會(huì)不一樣
        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 類的加載、連接和初始化

    詳解Java 類的加載、連接和初始化

    這篇文章主要介紹了Java 類的加載、連接和初始化的的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • Springcloud Nacos基本操作代碼實(shí)例

    Springcloud Nacos基本操作代碼實(shí)例

    這篇文章主要介紹了Springcloud Nacos基本操作代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Java詳解IO流創(chuàng)建讀取與寫入操作

    Java詳解IO流創(chuàng)建讀取與寫入操作

    這篇文章主要介紹了Java IO流,同時(shí)也介紹了流中的一些相關(guān)的內(nèi)容,并且通過大量的案例供大家理解。最后通過一些經(jīng)典的案例幫助大家對(duì)前面所學(xué)的知識(shí)做了一個(gè)綜合的應(yīng)用,需要的朋友可以參考一下
    2022-05-05
  • Java 單例模式的實(shí)現(xiàn)資料整理

    Java 單例模式的實(shí)現(xiàn)資料整理

    這篇文章主要介紹了Java 單例模式的實(shí)現(xiàn)的相關(guān)資料,并附簡單實(shí)例代碼,需要的朋友可以參考下
    2016-10-10
  • 搭建公司私有MAVEN倉庫的方法

    搭建公司私有MAVEN倉庫的方法

    這篇文章主要介紹了搭建公司私有MAVEN倉庫的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Java中synchronized關(guān)鍵字引出的多種鎖 問題

    Java中synchronized關(guān)鍵字引出的多種鎖 問題

    synchronized關(guān)鍵字是JAVA中常用的同步功能,提供了簡單易用的鎖功能。這篇文章主要介紹了Java中synchronized關(guān)鍵字引出的多種鎖問題,需要的朋友可以參考下
    2019-07-07
  • Java填充替換數(shù)組元素實(shí)例詳解

    Java填充替換數(shù)組元素實(shí)例詳解

    這篇文章主要通過兩個(gè)實(shí)例說明Java填充和替換數(shù)組中元素的方法,需要的朋友可以參考下。
    2017-08-08
  • java二叉樹的遍歷方式詳解

    java二叉樹的遍歷方式詳解

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)二叉樹遍歷的四種方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能給你帶來幫助
    2021-08-08
  • Java設(shè)計(jì)模式之外觀模式示例詳解

    Java設(shè)計(jì)模式之外觀模式示例詳解

    外觀模式為多個(gè)復(fù)雜的子系統(tǒng),提供了一個(gè)一致的界面,使得調(diào)用端只和這個(gè)接口發(fā)生調(diào)用,而無須關(guān)系這個(gè)子系統(tǒng)內(nèi)部的細(xì)節(jié)。本文將通過示例詳細(xì)為大家講解一下外觀模式,需要的可以參考一下
    2022-08-08
  • 簡單了解spring cloud 網(wǎng)關(guān)服務(wù)

    簡單了解spring cloud 網(wǎng)關(guān)服務(wù)

    這篇文章主要介紹了簡單了解spring cloud 網(wǎng)關(guān)服務(wù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10

最新評(píng)論