Java過(guò)濾器如何解決存儲(chǔ)型xss攻擊問(wèn)題
Java過(guò)濾器解決存儲(chǔ)型xss攻擊
XSS攻擊場(chǎng)景
攻擊者可以通過(guò)構(gòu)造URL注入JavaScript、VBScript、ActiveX、HTML或者Flash的手段,利用跨站腳本漏洞欺騙用戶(hù),收集Cookie等相關(guān)數(shù)據(jù)并冒充其他用戶(hù)。
通過(guò)精心構(gòu)造的惡意代碼,可以讓訪問(wèn)者訪問(wèn)非法網(wǎng)站或下載惡意木馬,如果再結(jié)合其他攻擊手段(如社會(huì)工程學(xué)、提權(quán)等),甚至可以獲取系統(tǒng)的管理權(quán)限。
舉例說(shuō)明
例如:
在項(xiàng)目看板里待材料初審存儲(chǔ)下面代碼,點(diǎn)擊A項(xiàng)目會(huì)彈出框
Payload: <iframe οnlοad=alert("xss");></iframe>
例如:
全部階段結(jié)果標(biāo)準(zhǔn)-存儲(chǔ)下面代碼,點(diǎn)擊20200927測(cè)試-2
Payload: <textarea οnfοcus=alert("xss"); autofocus>
解決方案
找到項(xiàng)目已有的filter過(guò)濾器,在過(guò)濾HttpServletRequest參數(shù)時(shí),進(jìn)行參數(shù)的處理,使用轉(zhuǎn)義,將 < 轉(zhuǎn)義為 & lt , > 轉(zhuǎn)義為 & gt
public PaasHttpRequestWrapper(HttpServletRequest request) { super(request); StringBuilder stringBuilder = new StringBuilder(); InputStream inputStream = null; try { inputStream = request.getInputStream(); } catch (IOException e) { throw new RuntimeException(e); } if (inputStream != null) { try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) { char[] charBuffer = new char[CHAR_BUFFER_LENGTH]; int bytesRead; while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { stringBuilder.append(charBuffer, BUFFER_START_POSITION, bytesRead); } } catch (IOException e) { e.printStackTrace(); } } else { stringBuilder.append(""); } body = stringBuilder.toString(); // 解決xss攻擊問(wèn)題 if (body.contains("<")) { body = body.replace("<", "<"); } if (body.contains(">")) { body = body.replace(">", ">"); } initParameterMap(); }
XSS攻擊及解決方案
什么是XSS攻擊?
XSS攻擊使用Javascript腳本注入進(jìn)行攻擊
XSS攻擊常出現(xiàn)在提交表單中,如博客的評(píng)論區(qū)等,用戶(hù)可以通過(guò)提交評(píng)論:<script>alert("你的網(wǎng)站太垃圾了!")</script>,那么只要訪問(wèn)該頁(yè)面的用戶(hù)都會(huì)彈窗,當(dāng)然,這可能是為了娛樂(lè)娛樂(lè),不要小看XSS攻擊,有些人利用XSS攻擊竊取用戶(hù)名密碼,調(diào)用黑客的工程,將用戶(hù)名和密碼發(fā)送過(guò)去,也可以偽裝成釣魚(yú)網(wǎng)站。
例如在表單中注入: <script>location.href='http://www.xxx.com'</script> 那么頁(yè)面會(huì)跳轉(zhuǎn)到xxx.com
還可以根據(jù)js獲取本地瀏覽器的cookie信息,根據(jù)cookie信息完全可以模擬用戶(hù)。
注意:谷歌瀏覽器 已經(jīng)防止了XSS攻擊,為了演示效果,最好使用火狐瀏覽器。
那么該如何防止XSS攻擊呢?
實(shí)現(xiàn)思路:
使用轉(zhuǎn)義解決。將<轉(zhuǎn)義為< >轉(zhuǎn)義為>
- ①使用過(guò)濾器,攔截所有請(qǐng)求,重寫(xiě)request
- ②重寫(xiě)獲取值的方法,將特殊代碼轉(zhuǎn)換成html
具體代碼實(shí)現(xiàn):
- XssHttpServletRequest.java
package cn.itcats; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import org.apache.commons.lang3.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; public class XssHttpServletRequest extends HttpServletRequestWrapper{ private HttpServletRequest request; //需要重寫(xiě)構(gòu)造方法 public XssHttpServletRequest(HttpServletRequest request) { super(request); this.request = request; } //需要重寫(xiě)getParameter(name)方法,將value進(jìn)行轉(zhuǎn)義 public String getParameter(String name) { String value = request.getParameter(name); System.out.println("沒(méi)有轉(zhuǎn)義之前:value="+value); if(StringUtils.isNotBlank(value)){ //轉(zhuǎn)化為html,<script>標(biāo)簽都會(huì)轉(zhuǎn)化為html格式 <script> //工具類(lèi)來(lái)自于org.apache.commons.lang3.StringEscapeUtils value = StringEscapeUtils.escapeHtml4(value); } return value; } }
- web.xml配置過(guò)濾器
<!-- 防止XSS攻擊 --> <filter> <filter-name>FilterXSS</filter-name> <filter-class>cn.itcats.FilterXSS</filter-class> </filter> <filter-mapping> <filter-name>FilterXSS</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
- FilterXss.java
package cn.itcats; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; public class FilterXSS implements Filter{ public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //強(qiáng)轉(zhuǎn)為HttpServletRequest HttpServletRequest req = (HttpServletRequest)request; //需要重寫(xiě)request,重建一個(gè)類(lèi)XssHttpServletRequest 繼承 HttpServletRequestWrapper,重寫(xiě)構(gòu)造和getParameter方法 XssHttpServletRequest xssHttpServletRequest = new XssHttpServletRequest(req); //務(wù)必傳入是重寫(xiě)過(guò)的request,放行 chain.doFilter(xssHttpServletRequest, response); } public void destroy() { } }
注意:只要是文本框、表單等,需要提交并在頁(yè)面展示的,一般都需要做防XSS攻擊。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
一次Spring項(xiàng)目打包問(wèn)題排查的實(shí)戰(zhàn)記錄
這篇文章主要給大家介紹了一次Spring項(xiàng)目打包問(wèn)題排查的實(shí)戰(zhàn)記錄,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Spring具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08SpringBoot熱部署啟動(dòng)關(guān)閉流程詳解
Spring?Boot啟動(dòng)熱部署是一種技術(shù),它能讓開(kāi)發(fā)者在不重啟應(yīng)用程序的情況下實(shí)時(shí)更新代碼。這樣可以提高開(kāi)發(fā)效率,避免頻繁重啟應(yīng)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-04-04Java實(shí)現(xiàn)的決策樹(shù)算法完整實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)的決策樹(shù)算法,簡(jiǎn)單描述了決策樹(shù)的概念、原理,并結(jié)合完整實(shí)例形式分析了java實(shí)現(xiàn)決策樹(shù)算法的相關(guān)操作技巧,代碼中備有較為詳盡的注釋便于理解,需要的朋友可以參考下2017-11-11了解Java虛擬機(jī)JVM的基本結(jié)構(gòu)及JVM的內(nèi)存溢出方式
這篇文章主要介紹了Java虛擬機(jī)JVM的基本結(jié)構(gòu)及JVM的內(nèi)存溢出方式,涉及到Java內(nèi)存分配相關(guān)方面的知識(shí),需要的朋友可以參考下2016-01-01SpringBoot整合jasypt實(shí)現(xiàn)重要數(shù)據(jù)加密
Jasypt是一個(gè)專(zhuān)注于簡(jiǎn)化Java加密操作的開(kāi)源工具,這篇文章主要為大家介紹了詳細(xì)介紹了如何使用jasypt實(shí)現(xiàn)重要數(shù)據(jù)加密,感興趣的小伙伴可以了解下2025-03-03Java前端Layer.open.btn驗(yàn)證無(wú)效解決方法
在本篇文章里我們給大家整理了一篇關(guān)于Java前端Layer.open.btn驗(yàn)證無(wú)效解決方法以及實(shí)例代碼,需要的朋友們可以參考學(xué)習(xí)下。2019-09-09Java Yml格式轉(zhuǎn)換為Properties問(wèn)題
本文介紹了作者編寫(xiě)一個(gè)Java工具類(lèi)來(lái)解決在線YAML到Properties轉(zhuǎn)換時(shí)屬性?xún)?nèi)容遺漏的問(wèn)題,通過(guò)遍歷YAML文件的樹(shù)結(jié)構(gòu),作者成功實(shí)現(xiàn)了屬性的完整轉(zhuǎn)換,總結(jié)指出,該工具類(lèi)適用于多種數(shù)據(jù)類(lèi)型,并且代碼簡(jiǎn)潔易懂2024-12-12