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

SpringBoot實現(xiàn)防止XSS攻擊的示例詳解

 更新時間:2024年03月28日 16:59:28   作者:H愚公移山H  
這篇文章主要為大家詳細介紹了SpringBoot如何實現(xiàn)防止XSS攻擊,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

XSS

跨站腳本工具(cross 斯特scripting),為不和層疊樣式表(cascading style sheets,CSS)的縮寫混淆,故將跨站腳本攻擊縮寫為XSS。惡意攻擊者往web頁面里插入惡意ScriptScript代碼,當用戶瀏覽該頁之時,嵌入其中Web里面的Script代碼會被執(zhí)行,從而達到惡意攻擊用戶的目的。防止XSS攻擊簡單的預(yù)防就是對Request請求中的一些參數(shù)去掉一些比較敏感的腳本命令。原本是打算通過SpringMVC的HandlerInterceptor機制來實現(xiàn)的,通過獲取request然后對request中的參數(shù)進行修改,結(jié)果雖然值修改了,但在Controller中獲取的數(shù)值還是沒有修改的。沒辦法就是要Filter來完成。簡單來說就是創(chuàng)建一個新的HttpRequest類XssHttpServletRequestWrapper,然后重寫一些get方法(獲取參數(shù)時對參數(shù)進行XSS判斷預(yù)防)

流程梳理

包裝request->創(chuàng)建過濾器->添加過濾器

1.創(chuàng)建包裝request的類 XssHttpServletRequestWrapper

 
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
import com.sysware.framework.exceptions.SyswareRuntimeException;
import com.sysware.framework.file.service.impl.FileGridServiceImpl;
 
 
public class XssHttpServletRequestWraper extends HttpServletRequestWrapper {
 
    private Logger log = LoggerFactory.getLogger(FileGridServiceImpl.class);
 
 
    public XssHttpServletRequestWraper() {
        super(null);
    }
 
    public XssHttpServletRequestWraper(HttpServletRequest httpservletrequest) {
        super(httpservletrequest);
        
    }
 
 //過濾springmvc中的 @RequestParam 注解中的參數(shù)
    public String[] getParameterValues(String s) {
 
        String str[] = super.getParameterValues(s);
        if (str == null) {
            return null;
        }
        int i = str.length;
        String as1[] = new String[i];
        for (int j = 0; j < i; j++) {
            //System.out.println("getParameterValues:"+str[j]);
            as1[j] = cleanXSS(cleanSQLInject(str[j]));
        }
        log.info("XssHttpServletRequestWraper凈化后的請求為:==========" + as1);
        return as1;
    }
 
 //過濾request.getParameter的參數(shù)
    public String getParameter(String s) {
        String s1 = super.getParameter(s);
        if (s1 == null) {
            return null;
        } else {
            String s2 = cleanXSS(cleanSQLInject(s1));
            log.info("XssHttpServletRequestWraper凈化后的請求為:==========" + s2);
            return s2;
        }
    }
 
 //過濾請求體 json 格式的
    @Override
    public ServletInputStream getInputStream() throws IOException {
        final ByteArrayInputStream bais = new ByteArrayInputStream(inputHandlers(super.getInputStream ()).getBytes ());
 
        return new ServletInputStream() {
 
            @Override
            public int read() throws IOException {
                return bais.read();
            }
 
            @Override
            public boolean isFinished() {
                return false;
            }
 
            @Override
            public boolean isReady() {
                return false;
            }
 
            @Override
            public void setReadListener(ReadListener readListener) { }
        };
        
    }
 
 
    public   String inputHandlers(ServletInputStream servletInputStream){
        StringBuilder sb = new StringBuilder();
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new InputStreamReader(servletInputStream, Charset.forName("UTF-8")));
            String line = "";
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (servletInputStream != null) {
                try {
                    servletInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return  cleanXSS(sb.toString ());
    }
 
    public String cleanXSS(String src) {
        String temp = src;
 
        src = src.replaceAll("<", "<").replaceAll(">", ">");
        src = src.replaceAll("\\(", "(").replaceAll("\\)", ")");
        src = src.replaceAll("'", "");
        src = src.replaceAll(";", "");
        /**-----------------------start--------------------------*/
        src = src.replaceAll("<", "& lt;").replaceAll(">", "& gt;");
        src = src.replaceAll("\\(", "& #40;").replaceAll("\\)", "& #41");
        src = src.replaceAll("eval\\((.*)\\)", "");
        src = src.replaceAll("[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']", "\"\"");
//        src = src.replaceAll("script", "");
//        src = src.replaceAll("link", "");
//        src = src.replaceAll("frame", "");
        /**-----------------------end--------------------------*/
        Pattern pattern = Pattern.compile("(eval\\((.*)\\)|script)",
                Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(src);
        src = matcher.replaceAll("");
 
        pattern = Pattern.compile("[\\\"\\'][\\s]*javascript:(.*)[\\\"\\']",
                Pattern.CASE_INSENSITIVE);
        matcher = pattern.matcher(src);
        src = matcher.replaceAll("\"\"");
 
        // 增加腳本
        src = src.replaceAll("script", "").replaceAll(";", "")
                /*.replaceAll("\"", "").replaceAll("@", "")*/
                .replaceAll("0x0d", "").replaceAll("0x0a", "");
 
//        if (!temp.equals(src)) {
//            // System.out.println("輸入信息存在xss攻擊!");
//            // System.out.println("原始輸入信息-->" + temp);
//            // System.out.println("處理后信息-->" + src);
// 
//            log.error("xss攻擊檢查:參數(shù)含有非法攻擊字符,已禁止繼續(xù)訪問?。?);
//            log.error("原始輸入信息-->" + temp);
// 
//            throw new SyswareRuntimeException("xss攻擊檢查:參數(shù)含有非法攻擊字符,已禁止繼續(xù)訪問?。?);
//        }
        return src;
    }
 
    //輸出
    public void outputMsgByOutputStream(HttpServletResponse response, String msg) throws IOException {
        ServletOutputStream outputStream = response.getOutputStream(); //獲取輸出流
        response.setHeader("content-type", "text/html;charset=UTF-8"); //通過設(shè)置響應(yīng)頭控制瀏覽器以UTF-8的編碼顯示數(shù)據(jù),如果不加這句話,那么瀏覽器顯示的將是亂碼
        byte[] dataByteArr = msg.getBytes("UTF-8");// 將字符轉(zhuǎn)換成字節(jié)數(shù)組,指定以UTF-8編碼進行轉(zhuǎn)換
        outputStream.write(dataByteArr);// 使用OutputStream流向客戶端輸出字節(jié)數(shù)組
    }
 
    // 需要增加通配,過濾大小寫組合
    public String cleanSQLInject(String src) {
        String lowSrc = src.toLowerCase();
        String temp = src;
        String lowSrcAfter = lowSrc.replaceAll(" insert ", "forbidI")
                .replaceAll(" select ", "forbidS")
                .replaceAll(" update ", "forbidU")
                .replaceAll(" delete ", "forbidD").replaceAll(" and ", "forbidA")
                .replaceAll(" or ", "forbidO").replace("'", "");
 
        if (!lowSrcAfter.equals(lowSrc)) {
            log.error("sql注入檢查:輸入信息存在SQL攻擊!");
            log.error("原始輸入信息-->" + temp);
            log.error("處理后信息-->" + lowSrc);
            throw new SyswareRuntimeException("sql注入檢查:參數(shù)含有非法攻擊字符,已禁止繼續(xù)訪問?。?);
 
        }
        return src;
    }
 
}

注意:

getInputStream()方法的流處理,注解方式獲取數(shù)據(jù)貌似是根據(jù)這個流取得的數(shù)據(jù)。

因為super.getInputStream()流只允許讀取一次,所以在getInputStream()方法中處理完流數(shù)據(jù)后返回了一個新的ServletInputStream。另外替換方法里的替換規(guī)則,也可以根據(jù)實際業(yè)務(wù)需要進行調(diào)整。

2.創(chuàng)建過濾器 XssFilter

@Component
public class XssFilter implements Filter {
 
 
    // 忽略權(quán)限檢查的url地址
    private final String[] excludeUrls = new String[]{
    		"/api/item","api/document"
    };
 
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
            throws IOException, ServletException {
 
        HttpServletRequest req = (HttpServletRequest) arg0;
        HttpServletResponse response = (HttpServletResponse) arg1;
 
        String pathInfo = req.getPathInfo() == null ? "" : req.getPathInfo();
        //獲取請求url的后兩層
        String url = req.getServletPath() + pathInfo;
        //獲取請求你ip后的全部路徑
        String uri = req.getRequestURI();
        //注入xss過濾器實例
        XssHttpServletRequestWraper reqW = new XssHttpServletRequestWraper(req);
 
        //過濾掉不需要的Xss校驗的地址
        for (String str : excludeUrls) {
            if (uri.indexOf(str) >= 0) {
            	//過濾
                arg2.doFilter(reqW, response);
                return;
            }
        }
        arg2.doFilter(arg0, response);
    }
    public void destroy() {
    }
    public void init(FilterConfig filterconfig1) throws ServletException {
    }
}

到此這篇關(guān)于SpringBoot實現(xiàn)防止XSS攻擊的示例詳解的文章就介紹到這了,更多相關(guān)SpringBoot防止XSS攻擊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring根據(jù)controller中接收請求參數(shù)不同走不同service的實現(xiàn)方法

    spring根據(jù)controller中接收請求參數(shù)不同走不同service的實現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于spring實現(xiàn)根據(jù)controller中接收請求參數(shù)不同走不同service的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2018-11-11
  • 深入了解Maven Settings.xml文件的結(jié)構(gòu)和功能

    深入了解Maven Settings.xml文件的結(jié)構(gòu)和功能

    這篇文章主要為大家介紹了Maven Settings.xml文件基本結(jié)構(gòu)和功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • idea創(chuàng)建JAVA Class時自動生成頭部文檔注釋的方法

    idea創(chuàng)建JAVA Class時自動生成頭部文檔注釋的方法

    這篇文章主要介紹了idea創(chuàng)建JAVA Class時自動生成頭部文檔注釋的方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • RocketMQ消息生產(chǎn)者是如何選擇Broker示例詳解

    RocketMQ消息生產(chǎn)者是如何選擇Broker示例詳解

    這篇文章主要為大家介紹了RocketMQ消息生產(chǎn)者是如何選擇Broker示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • SpringMVC 整合SSM框架詳解

    SpringMVC 整合SSM框架詳解

    這篇文章主要介紹了SpringMVC 整合SSM框架詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • SpringAOP核心對象的創(chuàng)建圖解

    SpringAOP核心對象的創(chuàng)建圖解

    這篇文章主要介紹了SpringAOP核心對象的創(chuàng)建詳解,通過使用AOP,我們可以將橫切關(guān)注點(如日志記錄、性能監(jiān)控、事務(wù)管理等)從業(yè)務(wù)邏輯中分離出來,使得代碼更加模塊化、可維護性更高,需要的朋友可以參考下
    2023-10-10
  • springMvc全局異常的實現(xiàn)

    springMvc全局異常的實現(xiàn)

    大家好,本篇文章主要講的是springMvc全局異常的實現(xiàn),感興趣的同學趕緊來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • 深度解析Java 21中虛擬線程的工作原理與實際應(yīng)用

    深度解析Java 21中虛擬線程的工作原理與實際應(yīng)用

    Java 21的發(fā)布標志著Java并發(fā)編程的一個重要里程碑,本文將深入探討虛擬線程的工作原理,優(yōu)勢以及在實際項目中的應(yīng)用,文中的示例代碼講解詳細,有需要的小伙伴可以了解下
    2025-09-09
  • jmeter壓力測試工具簡介_動力節(jié)點Java學院整理

    jmeter壓力測試工具簡介_動力節(jié)點Java學院整理

    這篇文章主要為大家詳細介紹了jmeter壓力測試工具相關(guān)介紹資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Java中注解的常見用法總結(jié)

    Java中注解的常見用法總結(jié)

    注解(Annotation),也叫元數(shù)據(jù),是JDK1.5及以后版本引入的一個特性,本文主要為大家介紹了注解的常見用法,需要的小伙伴可以參考一下
    2023-07-07

最新評論

北安市| 阳高县| 新巴尔虎右旗| 甘洛县| 伊金霍洛旗| 清远市| 柘荣县| 怀化市| 桃园市| 灵山县| 蓝山县| 长兴县| 岑溪市| 大姚县| 乌兰浩特市| 若尔盖县| 康保县| 焦作市| 泰兴市| 洛浦县| 化州市| 颍上县| 略阳县| 佳木斯市| 滦南县| 长汀县| 阳春市| 六安市| 静宁县| 永和县| 常宁市| 江油市| 卢龙县| 双城市| 绩溪县| 宜宾县| 武安市| 翁源县| 通江县| 同德县| 延寿县|