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

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

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

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

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

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

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

轉(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防護的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ù)值進行轉(zhuǎn)義,從而達到防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)文章

  • Java實現(xiàn)圖書管理系統(tǒng)的示例代碼

    Java實現(xiàn)圖書管理系統(tǒng)的示例代碼

    這篇文章主要為大家詳細介紹了如何利用java語言實現(xiàn)簡單的圖書管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Java中數(shù)組的定義和使用教程(一)

    Java中數(shù)組的定義和使用教程(一)

    這篇文章主要給大家介紹了關(guān)于Java中數(shù)組的定義和使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • idea導入module全流程

    idea導入module全流程

    這篇文章主要介紹了idea導入module全流程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • java實現(xiàn)word文件轉(zhuǎn)html文件

    java實現(xiàn)word文件轉(zhuǎn)html文件

    這篇文章主要為大家詳細介紹了java實現(xiàn)word文件轉(zhuǎn)html文件的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • 妙用Java8中的Function接口消滅if...else

    妙用Java8中的Function接口消滅if...else

    在開發(fā)過程中經(jīng)常會使用if...else...進行判斷拋出異常、分支處理等操作。這些if...else...充斥在代碼中嚴重影響了代碼代碼的美觀,本文就妙用Java8中的Function接口消滅if...else,感興趣的可以了解一下
    2022-01-01
  • Spring事件監(jiān)聽器ApplicationListener源碼詳解

    Spring事件監(jiān)聽器ApplicationListener源碼詳解

    這篇文章主要介紹了Spring事件監(jiān)聽器ApplicationListener源碼詳解,ApplicationEvent以及Listener是Spring為我們提供的一個事件監(jiān)聽、訂閱的實現(xiàn),內(nèi)部實現(xiàn)原理是觀察者設(shè)計模式,需要的朋友可以參考下
    2023-05-05
  • 用JAVA實現(xiàn)一套背壓機制

    用JAVA實現(xiàn)一套背壓機制

    背壓依我的理解來說,是指訂閱者能和發(fā)布者交互,可以調(diào)節(jié)發(fā)布者發(fā)布數(shù)據(jù)的速率,解決把訂閱者壓垮的問題,這篇文章主要介紹了用JAVA自己實現(xiàn)一套背壓機制,需要的朋友可以參考下
    2023-06-06
  • 如何用idea編寫并運行第一個spark scala處理程序

    如何用idea編寫并運行第一個spark scala處理程序

    詳細介紹了如何使用IntelliJ IDEA創(chuàng)建Scala項目,包括配置JDK和Scala SDK,添加Maven支持,編輯pom.xml,并創(chuàng)建及運行Scala程序,這為Scala初學者提供了一個基礎(chǔ)的項目搭建和運行指南
    2024-09-09
  • JAVA初級項目——實現(xiàn)圖書管理系統(tǒng)

    JAVA初級項目——實現(xiàn)圖書管理系統(tǒng)

    這篇文章主要介紹了JAVA如何實現(xiàn)圖書管理系統(tǒng),文中示例代碼非常詳細,供大家參考和學習,感興趣的朋友可以了解下
    2020-06-06
  • redis incr和incrBy的使用說明

    redis incr和incrBy的使用說明

    這篇文章主要介紹了redis incr和incrBy的使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11

最新評論

弥渡县| 梁山县| 石阡县| 三河市| 秦皇岛市| 江都市| 永吉县| 收藏| 巧家县| 通化县| 新兴县| 鄯善县| 东丰县| 蚌埠市| 高雄县| 辽源市| 商丘市| 青岛市| 嘉峪关市| 慈利县| 黄骅市| 长岭县| 盘锦市| 固阳县| 正镶白旗| 家居| 贺兰县| 若羌县| 盐亭县| 郑州市| 平泉县| 凉山| 江永县| 秦皇岛市| 温宿县| 乌海市| 垫江县| 灌南县| 襄城县| 永宁县| 高碑店市|