欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談Springboot2.0防止XSS攻擊的幾種方式

 更新時間:2022年08月04日 11:55:09   作者:一鍋之菌  
本文主要介紹了Springboot2.0防止XSS攻擊的幾種方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在平時做項目代碼開發(fā)的時候,很容易忽視XSS攻擊的防護(hù),網(wǎng)上有很多自定義全局?jǐn)r截器來實現(xiàn)XSS過濾,其實不需要這么麻煩,SpringBoot留有不少鉤子(擴(kuò)展點(diǎn)),據(jù)此我們可以巧妙地實現(xiàn)全局的XSS過濾

防止XSS攻擊,一般有兩種做法:

轉(zhuǎn)義
使用工具類HtmlUtils實現(xiàn)

過濾
將敏感標(biāo)簽去除
jsoup實現(xiàn)了非常強(qiáng)大的clean敏感標(biāo)簽的功能

轉(zhuǎn)義 做法的三種實現(xiàn):

轉(zhuǎn)義方法一:注冊自定義轉(zhuǎn)換器

自定義轉(zhuǎn)換器,集成PropertyEditorSupport類實現(xiàn),轉(zhuǎn)換器還可以實現(xiàn)數(shù)據(jù)格式轉(zhuǎn)換,例如:date的轉(zhuǎn)換;

@Component
public class DateEditor extends PropertyEditorSupport {

? ? Pattern pattern = Pattern.compile("[^0-9]");

? ? @Override
? ? public void setAsText(String text) throws IllegalArgumentException {
? ? ? ? if (StrUtil.isBlank(text)) {
? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? text = text.trim();
? ? ? ? Matcher matcher = pattern.matcher(text);
? ? ? ? text = matcher.replaceAll("");

? ? ? ? int length = text.length();
? ? ? ? Date date;
? ? ? ? switch (length) {
? ? ? ? ? ? case 14:
? ? ? ? ? ? ? ? date = DateTime.parse(text, DateTimeFormat.forPattern("yyyyMMddHHmmss")).toDate();
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case 12:
? ? ? ? ? ? ? ? date = DateTime.parse(text, DateTimeFormat.forPattern("yyyyMMddHHmm")).toDate();
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case 10:
? ? ? ? ? ? ? ? date = DateTime.parse(text, DateTimeFormat.forPattern("yyyyMMddHH")).toDate();
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case 8:
? ? ? ? ? ? ? ? date = DateTime.parse(text, DateTimeFormat.forPattern("yyyyMMdd")).toDate();
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case 6:
? ? ? ? ? ? ? ? date = DateTime.parse(text, DateTimeFormat.forPattern("yyyyMM")).toDate();
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case 4:
? ? ? ? ? ? ? ? date = DateTime.parse(text, DateTimeFormat.forPattern("yyyy")).toDate();
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? default:
? ? ? ? ? ? ? ? return;
? ? ? ? }
? ? ? ? setValue(date);
? ? }
}
@Component
public class StringEscapeEditor extends PropertyEditorSupport {

? ? public StringEscapeEditor() {
? ? ? ? super();
? ? }

? ? @Override
? ? public String getAsText() {
? ? ? ? Object value = getValue();
? ? ? ? return value != null ? value.toString() : "";
? ? }

? ? @Override
? ? public void setAsText(String text) {
? ? ? ? if (text == null) {
? ? ? ? ? ? setValue(null);
? ? ? ? } else {
? ? ? ? ? ? String value = text;
? ? ? ? ? ? value = value.trim();
? ? ? ? ? ? setValue(value);
? ? ? ? }
? ? }
}
@Slf4j
@Component
public class CommentWebBindingInitializer extends ConfigurableWebBindingInitializer {

? ? private final StringEscapeEditor stringEscapeEditor;

? ? private final DateEditor dateEditor;

? ? @Autowired
? ? public CommentWebBindingInitializer(StringEscapeEditor stringEscapeEditor, DateEditor dateEditor) {
? ? ? ? this.stringEscapeEditor = stringEscapeEditor;
? ? ? ? this.dateEditor = dateEditor;
? ? }

? ? @Override
? ? public void initBinder(WebDataBinder binder) {
? ? ? ? log.info("init bind editor");
? ? ? ? super.initBinder(binder);
? ? ? ? // 注冊自定義的類型轉(zhuǎn)換器
? ? ? ? binder.registerCustomEditor(Date.class, dateEditor);
? ? ? ? binder.registerCustomEditor(String.class, stringEscapeEditor);
? ? }
}

轉(zhuǎn)義方法二:BaseController

需要XSS防護(hù)的Controller的需要繼承該BaseController

public class BaseController {
?
? ? @Autowired
? ? private StringEscapeEditor stringEscapeEditor;
?
? ? @InitBinder
? ? public void initBinder(ServletRequestDataBinder binder) {
? ? ? ? binder.registerCustomEditor(String.class, stringEscapeEditor);
? ? }
}

轉(zhuǎn)義方法三:Converter

@Component
public class StringEscapeEditor implements Converter<String, String> {
 
    @Override
    public String convert(String s) {
        return StringUtils.isEmpty(s) ? s : HtmlUtils.htmlEscape(s);
    }
 
}
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
 
    @Autowired
    private LoginInterceptor loginInterceptor;
 
    @Autowired
    private StringEscapeEditor stringEscapeEditor;
 
    /**
     * 在參數(shù)綁定時,自定義String->String的轉(zhuǎn)換器,
     * 在轉(zhuǎn)換邏輯中對參數(shù)值進(jìn)行轉(zhuǎn)義,從而達(dá)到防XSS的效果
     *
     * @param registry
     */
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(StringEscapeEditor);
    }
 
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**")
                // 路徑不包括contextPath部分
                .excludePathPatterns("/user/login", "/user/logout", "/index/test1");
    }
 
    /**
     * 前后端分離需要解決跨域問題
     *
     * @param registry
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "POST", "PUT", "OPTIONS", "DELETE", "PATCH")
                .allowCredentials(true).maxAge(3600);
    }
}

到此這篇關(guān)于淺談Springboot2.0防止XSS攻擊的幾種方式的文章就介紹到這了,更多相關(guān)Springboot防止XSS攻擊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解關(guān)于SpringBoot的外部化配置使用記錄

    詳解關(guān)于SpringBoot的外部化配置使用記錄

    這篇文章主要介紹了詳解關(guān)于SpringBoot的外部化配置使用記錄,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • MyBatis中selectKey標(biāo)簽及主鍵回填實現(xiàn)

    MyBatis中selectKey標(biāo)簽及主鍵回填實現(xiàn)

    <selectKey>標(biāo)簽在MyBatis中提供了一種靈活的方式來生成和回填主鍵,本文就來介紹一下selectKey標(biāo)簽及主鍵回填實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-12-12
  • Java 如何利用緩沖流讀寫文件

    Java 如何利用緩沖流讀寫文件

    這篇文章主要介紹了Java 如何利用緩沖流讀寫文件的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Kotlin與Java 泛型缺陷和應(yīng)用場景詳解

    Kotlin與Java 泛型缺陷和應(yīng)用場景詳解

    這篇文章主要為大家介紹了Kotlin與Java 泛型缺陷和應(yīng)用場景詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Mybatis中typeAliases標(biāo)簽和package標(biāo)簽使用

    Mybatis中typeAliases標(biāo)簽和package標(biāo)簽使用

    這篇文章主要介紹了Mybatis中typeAliases標(biāo)簽和package標(biāo)簽使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java 實戰(zhàn)練手項目之醫(yī)院預(yù)約掛號系統(tǒng)的實現(xiàn)流程

    Java 實戰(zhàn)練手項目之醫(yī)院預(yù)約掛號系統(tǒng)的實現(xiàn)流程

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SpringBoot+Maven+Vue+mysql實現(xiàn)一個醫(yī)院預(yù)約掛號系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • SpringBoot中加密模塊的使用

    SpringBoot中加密模塊的使用

    本文主要介紹了SpringBoot中加密模塊的使用,包括對稱加密、非對稱加密和哈希加密等,同時還會提供相應(yīng)的代碼示例,感興趣的朋友可以參考一下
    2023-05-05
  • Java程序初始化啟動自動執(zhí)行的三種方式

    Java程序初始化啟動自動執(zhí)行的三種方式

    這篇文章主要介紹了Java程序初始化啟動自動執(zhí)行的三種方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • java 讀取文件方法的總結(jié)

    java 讀取文件方法的總結(jié)

    這篇文章主要介紹了java 讀取文件方法的總結(jié)的相關(guān)資料,這里提供文件讀取5種方法并附實例,需要的朋友可以參考下
    2017-08-08
  • Java靜態(tài)static關(guān)鍵字原理詳解

    Java靜態(tài)static關(guān)鍵字原理詳解

    這篇文章主要介紹了Java靜態(tài)static關(guān)鍵字原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12

最新評論