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

Java過濾XSS腳本攻擊詳細(xì)代碼示例

 更新時間:2024年10月11日 11:41:45   作者:IAmZRH  
這篇文章主要介紹了Java過濾XSS腳本攻擊的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

背景

之前公司信息安全部門對公司項目進(jìn)行網(wǎng)絡(luò)安全升級時,發(fā)現(xiàn)項目里可能會出現(xiàn)XSS腳本攻擊漏洞,所以就需要對其參數(shù)進(jìn)行過濾攔截。

XSS

百度百科:XSS攻擊全稱:cross site scripting(這里是為了和CSS區(qū)分,所以叫XSS),跨站腳本攻擊(XSS),是最普遍的Web應(yīng)用安全漏洞。這類漏洞能夠使得攻擊者嵌入惡意腳本代碼到正常用戶會訪問到的頁面中,當(dāng)正常用戶訪問該頁面時,則可導(dǎo)致嵌入的惡意腳本代碼的執(zhí)行,從而達(dá)到惡意攻擊用戶的目的。攻擊者可以使用戶在瀏覽器中執(zhí)行其預(yù)定義的惡意腳本,其導(dǎo)致的危害可想而知,如劫持用戶會話,插入惡意內(nèi)容、重定向用戶、使用惡意軟件劫持用戶瀏覽器、繁殖XSS蠕蟲,甚至破壞網(wǎng)站、修改路由器配置信息等。

  • xss漏洞攻擊分為三種:
    • 反射性XSS攻擊:前端在發(fā)送請求時,在url參數(shù)里攜帶一些腳本命令,然后等服務(wù)端把腳本在反射給瀏覽器執(zhí)行腳本代碼,進(jìn)行XSS漏洞攻擊
    • 存儲性XSS攻擊:和反射性XSS漏洞攻擊相似,但是服務(wù)器會進(jìn)行持久化保存腳本命令,后續(xù)用戶訪問該數(shù)據(jù)時持久性進(jìn)行XSS漏洞攻擊
    • DOS性XSS攻擊:和服務(wù)端沒有交互,靠瀏覽器的DOM解析進(jìn)行XSS攻擊

Java過濾

  • 預(yù)防XSS漏洞攻擊除了web端進(jìn)行解析過濾外,也還需要服務(wù)端進(jìn)行校驗過濾
  • 本次使用springboot項目中過濾器進(jìn)行對前端傳來的參數(shù)進(jìn)行過濾攔截
/**
 * springboot注冊過濾器
 *
 * @author: zrh
 * @date: 2021-11-17
 */

@Configuration
public class XssFilterConfig {

    @Bean
    public FilterRegistrationBean xssFilterRegistrationBean () {
        FilterRegistrationBean initXssFilterBean = new FilterRegistrationBean();
        // 設(shè)置自定義過濾器
        initXssFilterBean.setFilter(new XssFilter());
        // 設(shè)置優(yōu)先級(值越低,優(yōu)先級越高)
        initXssFilterBean.setOrder(1);
        // 設(shè)置過濾路徑
        initXssFilterBean.addUrlPatterns("/*");
        // 設(shè)置過濾器名稱
        initXssFilterBean.setName("XSS_filter");
        // 設(shè)置過濾器作用范圍(可以配置多種,這里指定過濾請求資源)
        initXssFilterBean.setDispatcherTypes(DispatcherType.REQUEST);
        return initXssFilterBean;
    }
}
  • spring項目中可以使用web.xml定義過濾器,springboot中沒有web.xml配置文件,那么就可以使用FilterRegistrationBean類把過濾器實例注冊到容器
/**
 * 自定義過濾器
 *
 * @author: zrh
 * @date: 2021-11-17
 */
@Slf4j
public class XssFilter implements Filter {

    @Override
    public void init (FilterConfig filterConfig) {
        // 初始化調(diào)用
    }

    @Override
    public void doFilter (ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        final XssHttpServletRequestWrapper requestWrapper = new XssHttpServletRequestWrapper((HttpServletRequest) servletRequest);
        filterChain.doFilter(requestWrapper, servletResponse);
    }

    @Override
    public void destroy () {
        // 銷毀調(diào)用
    }
}
/**
 * 重寫請求參數(shù)過濾
 *
 * @author: zrh
 * @date: 2021-11-17
 */
@Slf4j
public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {

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

    /**
     * 對GET請求中參數(shù)進(jìn)行過濾校驗
     *
     * @param name
     * @return
     */
    @Override
    public String[] getParameterValues (String name) {
        String[] values = super.getParameterValues(name);
        if (values == null) {
            return null;
        }
        int count = values.length;
        String[] cleanParams = new String[count];
        for (int i = 0; i < count; i++) {
            cleanParams[i] = String.valueOf(XssUtil.filterParam(values[i]));
            log.info("getParameterValues -> name:{},過濾前參數(shù):{},過濾后參數(shù):{}", name, values[i], cleanParams[i]);
        }
        return cleanParams;
    }

    /**
     * 對POST請求頭進(jìn)行參數(shù)過濾校驗
     *
     * @param header
     * @return
     */
    @Override
    public Enumeration getHeaders (String header) {
        final String value = super.getHeader(header);
        final LinkedList list = new LinkedList();
        if (value != null) {
            final Object param = XssUtil.filterParam(value);
            list.addFirst(param);
            log.info("getHeaders -> header:{},過濾前參數(shù):{},過濾后參數(shù):{}", header, value, param);
        }
        return Collections.enumeration(list);
    }

    /**
     * 對POST請求中body參數(shù)進(jìn)行校驗
     *
     * @return
     * @throws IOException
     */
    @Override
    public ServletInputStream getInputStream () throws IOException {
        final ByteArrayInputStream stream = new ByteArrayInputStream(inputHandlers(super.getInputStream()).getBytes());
        return new ServletInputStream() {
            @Override
            public int read () {
                return stream.read();
            }

            @Override
            public boolean isFinished () {
                return false;
            }

            @Override
            public boolean isReady () {
                return false;
            }

            @Override
            public void setReadListener (ReadListener readListener) {
            }
        };
    }

    /**
     * 解析請求流參數(shù)
     *
     * @param servletInputStream
     * @return
     */
    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) {
            log.error("異常 e:", e);
        } finally {
            if (servletInputStream != null) {
                try {
                    servletInputStream.close();
                } catch (IOException e) {
                    log.error("servletInputStream 關(guān)閉異常 e:", e);
                }
            }
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    log.error("reader 關(guān)閉異常 e:", e);
                }
            }
        }
        final String param = XssUtil.filterBody(sb.toString());
        log.info("getInputStream -> 過濾前參數(shù):{},過濾后參數(shù):{}", sb, param);
        return param;
    }
}
  • 重寫HttpServletRequestWrapper類用于過濾改變請求參數(shù)值
/**
 * 參數(shù)校驗工具類
 *
 * @author: zrh
 * @date: 2021-11-17
 */
@Slf4j
public final class XssUtil {

    private XssUtil () {
    }

    /**
     * 網(wǎng)上找的XSS匹配正則表達(dá)式
     */
    private final static Pattern[] PATTERNS = new Pattern[]{
            // Script fragments
            Pattern.compile("<script>(.*?)</script>", Pattern.CASE_INSENSITIVE),
            // src='...'
            Pattern.compile("src[\r\n]*=[\r\n]*\'(.*?)\'", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
            Pattern.compile("src[\r\n]*=[\r\n]*\"(.*?)\"", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
            // lonely script tags
            Pattern.compile("</script>", Pattern.CASE_INSENSITIVE),
            Pattern.compile("<script(.*?)>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
            // eval(...)
            Pattern.compile("eval\((.*?)\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
            // expression(...)
            Pattern.compile("expression\((.*?)\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
            // javascript:...
            Pattern.compile("javascript:", Pattern.CASE_INSENSITIVE),
            // vbscript:...
            Pattern.compile("vbscript:", Pattern.CASE_INSENSITIVE),
            // 空格英文單雙引號
            Pattern.compile("[\s'"]+", Pattern.CASE_INSENSITIVE),
            // onload(...)=...
            Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
            // alert
            Pattern.compile("alert(.*?)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL),
            Pattern.compile("<", Pattern.MULTILINE | Pattern.DOTALL),
            Pattern.compile(">", Pattern.MULTILINE | Pattern.DOTALL),
            //Checks any html tags i.e. <script, <embed, <object etc.
            Pattern.compile("(<(script|iframe|embed|frame|frameset|object|img|applet|body|html|style|layer|link|ilayer|meta|bgsound))")
    };

    /**
     * 對請求對象參數(shù)進(jìn)行過濾校驗
     *
     * @param params
     * @return
     */
    public static String filterBody (String params) {
        try {
            if (StringUtils.isBlank(params)) {
                return params;
            }
            final Map<String, Object> map = JSONObject.parseObject(params, Map.class);
            if (map.isEmpty()) {
                return params;
            }

            // 參數(shù)過濾
            final Iterator<Map.Entry<String, Object>> iterator = map.entrySet().stream().iterator();
            while (iterator.hasNext()) {
                final Map.Entry<String, Object> next = iterator.next();
                next.setValue(filterParam(next.getValue()));
            }
            return JSON.toJSONString(map);
        } catch (Exception e) {
            log.error("XSS過濾異常:", e);
        }
        return params;
    }

    /**
     * 對請求字符串參數(shù)進(jìn)行過濾校驗
     *
     * @param param
     * @param <T>
     * @return
     */
    public static <T> Object filterParam (T param) {
        if (param instanceof String) {
            try {
                String value = String.valueOf(param);
                for (Pattern pattern : PATTERNS) {
                    value = pattern.matcher(value).replaceAll("");
                }
                return value;
            } catch (Exception e) {
                log.error("XSS參數(shù)過濾異常:", e);
            }
        }
        return param;
    }
}
  • XSS過濾參數(shù)的正則工具類
/**
 *
 * @Author: ZRH
 * @Date: 2021/11/17
 */
@RestController
public class XssTest {

    @PostMapping("/xss/test")
    public String test (@RequestBody JSONObject jsonObject) {
        System.out.println(jsonObject.toJSONString());
        return "OK";
    }

    @GetMapping("/xss/test")
    public String test (@RequestParam Integer data, @RequestParam String result) {
        System.out.println(data);
        return "OK";
    }
}

模擬請求響應(yīng)結(jié)果:
17:07:06.597 - [http-nio-8888-exec-1] - getHeaders -> header:content-type,過濾前參數(shù):application/json,過濾后參數(shù):application/json
17:07:06.598 - [http-nio-8888-exec-1] - getHeaders -> header:token,過濾前參數(shù):123,過濾后參數(shù):123
17:07:06.598 - [http-nio-8888-exec-1] - getHeaders -> header:a,過濾前參數(shù):123,過濾后參數(shù):123
17:07:06.598 - [http-nio-8888-exec-1] - getHeaders -> header:b,過濾前參數(shù):<script>alert("XSS");</script>,過濾后參數(shù):
17:07:06.599 - [http-nio-8888-exec-1] - getHeaders -> header:content-length,過濾前參數(shù):67,過濾后參數(shù):67
17:07:06.599 - [http-nio-8888-exec-1] - getHeaders -> header:host,過濾前參數(shù):localhost:8888,過濾后參數(shù):localhost:8888
17:07:06.599 - [http-nio-8888-exec-1] - getHeaders -> header:connection,過濾前參數(shù):Keep-Alive,過濾后參數(shù):Keep-Alive
17:07:06.599 - [http-nio-8888-exec-1] - getHeaders -> header:user-agent,過濾前參數(shù):Apache-HttpClient/4.5.12 (Java/11.0.8),過濾后參數(shù):Apache-HttpClient/4.5.12(Java/11.0.8)
17:07:06.599 - [http-nio-8888-exec-1] - getHeaders -> header:accept-encoding,過濾前參數(shù):gzip,deflate,過濾后參數(shù):gzip,deflate
17:07:06.648 - [http-nio-8888-exec-1] - getInputStream -> 過濾前參數(shù):{  "a": "1",  "b": 2,  "c": "<script>alert(\"XSS\");</script>"},過濾后參數(shù):{"a":"1","b":2,"c":""}
{"a":"1","b":2,"c":""}

最后

  • 除了可以使用過濾器以外,還可以使用攔截器進(jìn)行攔截校驗。大致流程也差不多,先獲取參數(shù),然后進(jìn)行校驗,最后重新賦值。
  • 上述代碼例子只是簡單粗化版,在實際項目中要根據(jù)需求進(jìn)行代碼調(diào)整和性能優(yōu)化后才可在線上使用。

到此這篇關(guān)于Java過濾XSS腳本攻擊的文章就介紹到這了,更多相關(guān)Java過濾XSS腳本攻擊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實現(xiàn)按行讀取大文件

    Java實現(xiàn)按行讀取大文件

    這篇文章主要介紹了Java實現(xiàn)按行讀取大文件的方法的小結(jié),非常的簡單實用,有需要的小伙伴尅參考下。
    2015-05-05
  • 淺析SpringCloud Alibaba-Nacos 作為注冊中心示例代碼

    淺析SpringCloud Alibaba-Nacos 作為注冊中心示例代碼

    這篇文章主要介紹了SpringCloud Alibaba-Nacos 作為注冊中心示例代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • java 正則,object中兩個方法的使用(詳解)

    java 正則,object中兩個方法的使用(詳解)

    下面小編就為大家?guī)硪黄猨ava 正則,object中兩個方法的使用(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • idea maven pom不自動更新的解決方法

    idea maven pom不自動更新的解決方法

    這篇文章主要介紹了idea maven pom不自動更新的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Ubuntu 安裝 JDK8 的兩種方法(總結(jié))

    Ubuntu 安裝 JDK8 的兩種方法(總結(jié))

    下面小編就為大家?guī)硪黄猆buntu 安裝 JDK8 的兩種方法(總結(jié))。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • JAVA GUI自定義JPanel畫板背景

    JAVA GUI自定義JPanel畫板背景

    這篇文章主要為大家詳細(xì)介紹了JAVA GUI自定義JPanel畫板背景的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 詳解Java如何在Array和List之間進(jìn)行轉(zhuǎn)換

    詳解Java如何在Array和List之間進(jìn)行轉(zhuǎn)換

    這篇文章主要為大家介紹了詳解Java如何在Array和List之間進(jìn)行轉(zhuǎn)換的方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 帶你深入理解MyBatis緩存機(jī)制

    帶你深入理解MyBatis緩存機(jī)制

    緩存是一般的ORM框架都會提供的功能,目的就是提升查詢的效率和減少數(shù)據(jù)庫的壓力,跟Hibernate 一樣,MyBatis 也有一級緩存和二級緩存,并且預(yù)留了集成第三方緩存的接口,這篇文章主要給大家介紹了關(guān)于MyBatis緩存機(jī)制的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • Java springboot接口迅速上手,帶你半小時極速入門

    Java springboot接口迅速上手,帶你半小時極速入門

    這篇文章主要給大家介紹了關(guān)于SpringBoot實現(xiàn)API接口的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-09-09
  • SpringBoot?spring.factories加載時機(jī)分析

    SpringBoot?spring.factories加載時機(jī)分析

    這篇文章主要為大家介紹了SpringBoot?spring.factories加載時機(jī)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03

最新評論

竹溪县| 句容市| 惠东县| 宁津县| 耒阳市| 凤庆县| 安图县| 日喀则市| 田东县| 同德县| 江安县| 翁源县| 分宜县| 思茅市| 临清市| 石景山区| 怀来县| 江津市| 文安县| 察雅县| 肇东市| 太白县| 清苑县| 阿尔山市| 武邑县| 安阳县| 昆山市| 如东县| 方山县| 福州市| 陈巴尔虎旗| 冕宁县| 从江县| 赫章县| 连江县| 交城县| 定远县| 宕昌县| 金阳县| 木兰县| 石河子市|