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

springBoot集成jsoup解決安全漏洞之XSS注入攻擊問(wèn)題

 更新時(shí)間:2025年06月24日 09:55:07   作者:yololee_  
這篇文章主要介紹了springBoot集成jsoup解決安全漏洞之XSS注入攻擊問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

跨站點(diǎn)腳本編制

  • 風(fēng)險(xiǎn):可能會(huì)竊取或操縱客戶會(huì)話和 cookie,它們可能用于模仿合法用戶,從而使黑客能夠以該用戶身份查看或變更用戶記錄以及執(zhí)行事務(wù)。
  • 原因:未對(duì)用戶輸入正確執(zhí)行危險(xiǎn)字符清理
  • 固定值:查看危險(xiǎn)字符注入的可能解決方案

一、依賴

        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.11.3</version>
        </dependency>

二、自定義過(guò)濾器

XSS過(guò)濾處理邏輯

package com.yolo.springboot.kaptcha.filter;

import lombok.extern.slf4j.Slf4j;
import org.jsoup.Jsoup;
import org.jsoup.safety.Whitelist;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

/**
 * XSS過(guò)濾處理
 */
@Slf4j
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {

    public XssHttpServletRequestWrapper(HttpServletRequest request)
    {
        super(request);
    }

    /**
     * 獲取頭部參數(shù)
     * @param v 參數(shù)值
     */
    @Override
    public String getHeader(String v) {
        String header = super.getHeader(v);
        if (header == null || "".equals(header)) {
            return header;
        }
        return Jsoup.clean(super.getHeader(v), Whitelist.relaxed());
    }

    /**
     * 獲取參數(shù)
     * @param v 參數(shù)值
     */
    @Override
    public String getParameter(String v) {
        String param = super.getParameter(v);
        if (param == null || "".equals(param)) {
            return param;
        }
        return Jsoup.clean(super.getParameter(v), Whitelist.relaxed());
    }

    /**
     * 獲取參數(shù)值
     * @param v 參數(shù)值
     */
    @Override
    public String[] getParameterValues(String v) {
        String[] values = super.getParameterValues(v);
        if (values == null) {
            return values;
        }
        int length = values.length;
        String[] resultValues = new String[length];
        for (int i = 0; i < length; i++) {
            // 過(guò)濾特殊字符
            resultValues[i] = Jsoup.clean(values[i], Whitelist.relaxed()).trim();
            if (!(resultValues[i]).equals(values[i])) {
                log.debug("XSS過(guò)濾器 => 過(guò)濾前:{} => 過(guò)濾后:{}", values[i], resultValues[i]);
            }
        }
        return resultValues;
    }
}

防止XSS攻擊的過(guò)濾器

package com.yolo.springboot.kaptcha.filter;

import org.apache.commons.lang3.StringUtils;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @ClassName XssFilter
 * @Description 防止XSS攻擊的過(guò)濾器
 * @Author hl
 * @Date 2022/12/7 10:07
 * @Version 1.0
 */
public class XssFilter implements Filter {

    /**
     * 排除鏈接
     */
    public List<String> noFilterUrls = new ArrayList<>();

    /**
     * xss過(guò)濾開(kāi)關(guān)
     */
    public boolean enabled = true;


    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 從過(guò)濾器配置中獲取initParams參數(shù)
        String noFilterUrl = filterConfig.getInitParameter("noFilterUrl");
        // 將排除的URL放入成員變量noFilterUrls中
        if (StringUtils.isNotBlank(noFilterUrl)) {
            noFilterUrls = new ArrayList<>(Arrays.asList(noFilterUrl.split(",")));
        }
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        if (!enabled || handleExcludeURL(req)) {
            filterChain.doFilter(servletRequest, servletResponse);
            return;
        }
        XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper(req);
        filterChain.doFilter(xssRequest, servletResponse);
    }

    /**
     * 判斷是否為忽略的URL
     * @return true-忽略,false-過(guò)濾
     */
    private boolean handleExcludeURL(HttpServletRequest request) {
        if (noFilterUrls == null || noFilterUrls.isEmpty()) {
            return false;
        }

        String url = request.getServletPath();
//        return excludes.stream().map(pattern -> Pattern.compile("^" + pattern)).map(p -> p.matcher(url))
//                .anyMatch(Matcher::find);
        for (String pattern : noFilterUrls) {
            Pattern p = Pattern.compile("^" + pattern);
            Matcher m = p.matcher(url);
            if (m.find()) {
                return true;
            }
        }
        return false;
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

注冊(cè)過(guò)濾器

package com.yolo.springboot.kaptcha.config;

import com.yolo.springboot.kaptcha.filter.XssFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Configuration
public class FilterConfig {


    @Bean
    public FilterRegistrationBean<?> xssFilterRegistration() {
        FilterRegistrationBean<XssFilter> registration = new FilterRegistrationBean<>();
        // 將過(guò)濾器配置到FilterRegistrationBean對(duì)象中
        registration.setFilter(new XssFilter());
        // 給過(guò)濾器取名
        registration.setName("xssFilter");
        // 設(shè)置過(guò)濾器優(yōu)先級(jí),該值越小越優(yōu)先被執(zhí)行
        registration.setOrder(0);
        List<String> urlPatterns = new ArrayList<>();
        urlPatterns.add("/*");
        //這里需要填寫(xiě)排除上傳文件的接口
        Map<String, String> paramMap = new HashMap<>();
        paramMap.put("noFilterUrl", "/login,/logout,/images/*");
        // 設(shè)置initParams參數(shù)
        registration.setInitParameters(paramMap);
        // 設(shè)置urlPatterns參數(shù)
        registration.setUrlPatterns(urlPatterns);
        return registration;
    }
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java Grpc實(shí)例創(chuàng)建負(fù)載均衡詳解

    Java Grpc實(shí)例創(chuàng)建負(fù)載均衡詳解

    這篇文章主要介紹了Java Grpc實(shí)例創(chuàng)建負(fù)載均衡詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 后端java壓縮圖片超詳細(xì)圖文教程

    后端java壓縮圖片超詳細(xì)圖文教程

    這篇文章主要給大家介紹了關(guān)于后端java壓縮圖片的相關(guān)資料,片壓縮是一種廣泛采用的技術(shù),它不僅能顯著減小文件大小,釋放更多存儲(chǔ)空間,還能提升圖片加載速度,避免長(zhǎng)時(shí)間等待,需要的朋友可以參考下
    2024-04-04
  • Java生成隨機(jī)姓名、性別和年齡的實(shí)現(xiàn)示例

    Java生成隨機(jī)姓名、性別和年齡的實(shí)現(xiàn)示例

    這篇文章主要介紹了Java生成隨機(jī)姓名、性別和年齡的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • SpringBoot中Formatter和Converter用法和區(qū)別小結(jié)

    SpringBoot中Formatter和Converter用法和區(qū)別小結(jié)

    本文主要介紹了SpringBoot中Formatter和Converter用法和區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • SpringBoot3實(shí)現(xiàn)webclient的通用方法詳解

    SpringBoot3實(shí)現(xiàn)webclient的通用方法詳解

    Spring Boot WebClient 是 Spring Framework 5 中引入的一個(gè)新的響應(yīng)式 Web 客戶端,用于異步和響應(yīng)式地與外部服務(wù)進(jìn)行通信,下面我們就來(lái)看看SpringBoot3實(shí)現(xiàn)webclient的通用方法吧
    2024-04-04
  • Java實(shí)現(xiàn)MySQL數(shù)據(jù)實(shí)時(shí)同步至Elasticsearch的方法詳解

    Java實(shí)現(xiàn)MySQL數(shù)據(jù)實(shí)時(shí)同步至Elasticsearch的方法詳解

    MySQL擅長(zhǎng)事務(wù)處理,而Elasticsearch(ES)則專注于搜索與分析,將MySQL數(shù)據(jù)實(shí)時(shí)同步到ES,可以充分發(fā)揮兩者的優(yōu)勢(shì),下面我們就來(lái)看看如何使用Java實(shí)現(xiàn)這一功能吧
    2025-03-03
  • SpringBoot實(shí)現(xiàn)配置文件的替換

    SpringBoot實(shí)現(xiàn)配置文件的替換

    這篇文章主要介紹了SpringBoot實(shí)現(xiàn)配置文件的替換,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java中hasNextInt()的使用場(chǎng)景和注意事項(xiàng)

    Java中hasNextInt()的使用場(chǎng)景和注意事項(xiàng)

    hasNextInt()方法是判斷控制臺(tái)接收是否為整型數(shù)字,而不是接收數(shù)據(jù),這篇文章主要介紹了Java中hasNextInt()的使用場(chǎng)景和注意事項(xiàng)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-05-05
  • Spring?Boot?攔截器幫助解鎖5種常用場(chǎng)景(推薦)

    Spring?Boot?攔截器幫助解鎖5種常用場(chǎng)景(推薦)

    在SpringBoot中,攔截器用于在請(qǐng)求處理前后插入自定義邏輯,實(shí)現(xiàn)權(quán)限校驗(yàn)、日志記錄、性能監(jiān)控等功能,本文給大家介紹Spring?Boot?攔截器幫助解鎖5大實(shí)用場(chǎng)景,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • ClassLoader雙親委派模式作用詳解

    ClassLoader雙親委派模式作用詳解

    這篇文章主要為大家介紹了ClassLoader雙親委派模式作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10

最新評(píng)論

河池市| 时尚| 新宾| 海宁市| 淮北市| 郁南县| 沂源县| 张掖市| 讷河市| 黑山县| 晋城| 高尔夫| 班玛县| 砚山县| 松滋市| 九龙县| 沂源县| 凤山市| 北川| 延安市| 抚宁县| 泉州市| 印江| 镇雄县| 天台县| 甘泉县| 永和县| 绥滨县| 芦溪县| 手游| 都江堰市| 乌拉特前旗| 盐城市| 石台县| 红安县| 衡东县| 合江县| 鹤壁市| 宜宾市| 交城县| 易门县|