SpringBoot如何使用注解進(jìn)行XSS防御
在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)文章
Springcloud Nacos基本操作代碼實(shí)例
這篇文章主要介紹了Springcloud Nacos基本操作代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12Java中synchronized關(guān)鍵字引出的多種鎖 問題
synchronized關(guān)鍵字是JAVA中常用的同步功能,提供了簡單易用的鎖功能。這篇文章主要介紹了Java中synchronized關(guān)鍵字引出的多種鎖問題,需要的朋友可以參考下2019-07-07簡單了解spring cloud 網(wǎng)關(guān)服務(wù)
這篇文章主要介紹了簡單了解spring cloud 網(wǎng)關(guān)服務(wù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10