日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解java解決XSS攻擊常用方法總結

瀏覽:160日期:2022-08-14 10:55:49
前言

在項目驗收階段,通常會對待驗收項目做一些安全漏洞的測試,比如接口攻擊,并發測試,XSS注入,SQL惡意注入測試,安全越權等操作,這時,就是考驗項目的安全方面是否做的足夠健壯的時候,本篇對XSS腳本攻擊在實際WEB項目中的處理辦法,提供2種可實行的方法

xss攻擊

XSS攻擊通常指的是通過利用網頁開發時留下的漏洞,通過巧妙的方法注入惡意指令代碼到網頁,使用戶加載并執行攻擊者惡意制造的網頁程序。這些惡意網頁程序通常是JavaScript,但實際上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻擊成功后,攻擊者可能得到包括但不限于更高的權限(如執行一些操作)、私密網頁內容、會話和cookie等各種內容

簡單說就是說,通過在輸入框輸入一些js代碼,如在賬號密碼輸入框中輸入

<video src=1 onerror=alert(/xss/)/>

或者

<script>alert('@@') </script>

這樣點擊提交的時候就會觸發alert彈窗,分別彈出 xss 和 @@ 的內容,這里只是做個簡單的演示,彈了個窗口,還能存儲病毒下載地址到服務端,進入的時候自動下載,或者修改你的cookie啥的,這里感興趣可以百度查查xss攻擊

解決方式一:強制修改html敏感標簽內容

這是一種相對容易理解的方式,解決思路就是,當惡意注入的字段中,包含了類似<script>alert(ooo)</script>這種html標簽時,后臺程序代碼中強制替換或更改標簽內容,這樣存入數據庫的內容再次返回至頁面時,就不會以html的形式進行執行了

下面提供一個工具類

/** * xss特殊字符攔截與過濾 * * @author zhangcy * @date 2021-04016 */public class XssStrUtils { /** * 濾除content中的危險 HTML 代碼, 主要是腳本代碼, 滾動字幕代碼以及腳本事件處理代碼 * @param content 需要濾除的字符串 * @return 過濾的結果 */ public static String replaceHtmlCode(String content) {if (null == content) return null;if (0 == content.length()) return '';// 需要濾除的腳本事件關鍵字String[] eventKeywords = {'onmouseover', 'onmouseout', 'onmousedown', 'onmouseup', 'onmousemove', 'onclick', 'ondblclick','onkeypress', 'onkeydown', 'onkeyup', 'ondragstart', 'onerrorupdate', 'onhelp', 'onreadystatechange','onrowenter', 'onrowexit', 'onselectstart', 'onload', 'onunload', 'onbeforeunload', 'onblur','onerror', 'onfocus', 'onresize', 'onscroll', 'oncontextmenu', 'alert'};content = replace(content, '<script', '<script', false);content = replace(content, '</script', '</script', false);content = replace(content, '<marquee', '<marquee', false);content = replace(content, '</marquee', '</marquee', false);content = replace(content, '’', '_', false);// 將單引號替換成下劃線content = replace(content, ''', '_', false);// 將雙引號替換成下劃線// 濾除腳本事件代碼for (int i = 0; i < eventKeywords.length; i++) { content = replace(content, eventKeywords[i], '_' + eventKeywords[i], false); // 添加一個'_', 使事件代碼無效}return content; } /** * 將字符串 source 中的 oldStr 替換為 newStr, 并以大小寫敏感方式進行查找 * * @param source 需要替換的源字符串 * @param oldStr 需要被替換的老字符串 * @param newStr 替換為的新字符串 */ private static String replace(String source, String oldStr, String newStr) {return replace(source, oldStr, newStr, true); } /** * 將字符串 source 中的 oldStr 替換為 newStr, matchCase 為是否設置大小寫敏感查找 * * @param source 需要替換的源字符串 * @param oldStr 需要被替換的老字符串 * @param newStr 替換為的新字符串 * @param matchCase 是否需要按照大小寫敏感方式查找 */ private static String replace(String source, String oldStr, String newStr,boolean matchCase) {if (source == null) return null;// 首先檢查舊字符串是否存在, 不存在就不進行替換if (source.toLowerCase().indexOf(oldStr.toLowerCase()) == -1) return source;int findStartPos = 0;int a = 0;while (a > -1) { int b = 0; String str1, str2, str3, str4, strA, strB; str1 = source; str2 = str1.toLowerCase(); str3 = oldStr; str4 = str3.toLowerCase(); if (matchCase) {strA = str1;strB = str3; } else {strA = str2;strB = str4; } a = strA.indexOf(strB, findStartPos); if (a > -1) {b = oldStr.length();findStartPos = a + b;StringBuffer bbuf = new StringBuffer(source);source = bbuf.replace(a, a + b, newStr) + '';// 新的查找開始點位于替換后的字符串的結尾findStartPos = findStartPos + newStr.length() - b; }}return source; }}

我們用一個實際的接口做一下簡單的測試

@PostMapping('/getAccName') public String getAccName(@RequestBody NameParams params){String s = XssStrUtils.replaceHtmlCode(params.getName());return s; }

使用接口工具調一下,

詳解java解決XSS攻擊常用方法總結

使用這種方式,即使前端惡意注入了某些非法的html標簽,經過后端的過濾處理,返回的內容就不會執行html的相關操作事件了

解決方式二:利用過濾器過濾非法html標簽

第二種思路,考慮在過濾器中添加對所有請求接口的參數進行參數的攔截過濾,即程序認為的不合法標簽都會自動做過濾,至于過濾的規則,可以借助現有的第三方組件,比如spring框架的htmlUtil類,這里使用hutool工具集提供的相關API做處理

導入依賴

<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.5.9</version></dependency>

1、添加自定義過濾器增強包裝類

public class XssHttpRequestWrapper extends HttpServletRequestWrapper { public XssHttpRequestWrapper(HttpServletRequest request) {super(request); } @Override public String getParameter(String name) {String value = super.getParameter(name);if(!StringUtils.isEmpty(value)){ value = HtmlUtil.filter(value);}return value; } @Override public String[] getParameterValues(String name) {String[] values = super.getParameterValues(name);if(values!=null){ for(int i=0;i<values.length;i++){String value = values[i];if(!StringUtils.isEmpty(value)){ value = HtmlUtil.filter(value);}values[i]=value; }}return values; } @Override public Map<String, String[]> getParameterMap() {Map<String, String[]> parameters = super.getParameterMap();Map<String, String[]> map = new LinkedHashMap<>();if(parameters !=null){ for(String key : parameters.keySet()){String[] values = parameters.get(key);for(int i=0;i<values.length;i++){ String value = values[i]; if(!StringUtils.isEmpty(value)){value = HtmlUtil.filter(value); } values[i]=value;}map.put(key,values); }}return map; } @Override public String getHeader(String name) {String value = super.getHeader(name);if(!StringUtils.isEmpty(value)){ value = HtmlUtil.filter(value);}return value; } @Override public ServletInputStream getInputStream() throws IOException {InputStream in = super.getInputStream();InputStreamReader reader = new InputStreamReader(in, Charset.forName('UTF-8'));BufferedReader buffer = new BufferedReader(reader);StringBuffer body = new StringBuffer();String line = buffer.readLine();while (line !=null){ body.append(line); line = buffer.readLine();}buffer.close();reader.close();in.close();Map<String,Object> map = JSONUtil.parseObj(body.toString());Map<String,Object> result = new LinkedHashMap<>();for(String key : map.keySet()){ Object val = map.get(key); if(val instanceof String){if(!StringUtils.isEmpty(val.toString())){ result.put(key,HtmlUtil.filter(val.toString()));} }else {result.put(key,val); }}String json = JSONUtil.toJsonStr(result);ByteArrayInputStream bain = new ByteArrayInputStream(json.getBytes());return new ServletInputStream() { @Override public boolean isFinished() {return false; } @Override public boolean isReady() {return false; } @Override public void setReadListener(ReadListener readListener) { } @Override public int read() throws IOException {return bain.read(); }}; }}

可以理解為,在自定義過濾器中添加上面的增強類,那么所有請求后端的接口都將先走改類的邏輯,參數進行過濾

2、自定義過濾器并注入全局bean

public class XssFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest)servletRequest;XssHttpRequestWrapper requestWrapper = new XssHttpRequestWrapper(request);filterChain.doFilter(requestWrapper,servletResponse); } @Override public void destroy() { }}

@Configurationpublic class XSSFilterRegister { @Bean public FilterRegistrationBean<XssFilter> RegistTest1(){//通過FilterRegistrationBean實例設置優先級可以生效FilterRegistrationBean<XssFilter> bean = new FilterRegistrationBean<XssFilter>();bean.setFilter(new XssFilter());//注冊自定義過濾器bean.setName('flilter');//過濾器名稱bean.addUrlPatterns('/*');//過濾所有路徑return bean; }}

仍然使用上面的接口做一下測試

@PostMapping('/getAccName') public String getAccName(@RequestBody NameParams params){return 'name is : '+ params.getName(); }

詳解java解決XSS攻擊常用方法總結

通過這種方式,直接將注入的敏感標簽符號去掉,這樣確保了入庫的數據的安全性,返回給頁面的數據就不存在非法html標簽問題了

到此這篇關于詳解java解決XSS攻擊常用方法總結的文章就介紹到這了,更多相關java XSS攻擊 內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本亚洲欧美天堂免费| 亚洲国产专区校园欧美| 一区二区国产精品| 韩日一区二区三区| 亚洲激情社区| 视频一区二区三区在线| 最新国产精品| 欧美日韩91| 免费视频一区二区三区在线观看| 亚洲精品自拍| 国产日韩1区| 久久99精品久久久野外观看| 欧美激情麻豆| 97精品中文字幕| 91精品久久久久久久久久不卡| 婷婷成人综合| 在线免费观看亚洲| 国产情侣久久| 精品福利久久久| 成人午夜精品| 亚洲激情二区| 日本强好片久久久久久aaa| 国产欧美欧美| 日韩国产欧美一区二区| 伊人久久av| 日韩网站在线| 97久久超碰| 国产精品成人一区二区不卡| 免费欧美一区| 日韩精品五月天| 久久影院一区二区三区| 日韩综合在线| 精品一区欧美| 91精品麻豆| av高清不卡| 国产视频欧美| 久久国产精品免费一区二区三区 | 六月婷婷综合| 国产精品三p一区二区| 国产99久久| 99在线观看免费视频精品观看| 亚洲日本在线观看视频| 国产成人精品免费视| 亚洲精品123区| 国产精品一区二区免费福利视频 | 美女久久久久久| 麻豆网站免费在线观看| 日韩中文欧美在线| 欧美91在线|欧美| 亚洲福利国产| 国产精品视频一区二区三区综合| 国产一区二区三区四区| 久久福利影视| 久久精品国产亚洲aⅴ| 欧美日韩免费观看一区=区三区| 69堂免费精品视频在线播放| 欧美日韩亚洲在线观看| 18国产精品| 黄色欧美在线| 免费看欧美美女黄的网站| 中文一区二区| 精品久久在线| 亚洲区国产区| 午夜久久中文| 日韩激情精品| 亚洲二区三区不卡| 五月亚洲婷婷 | 日韩大片在线播放| 午夜精品福利影院| 亚洲大全视频| 国产成人精品一区二区三区免费| 日本大胆欧美人术艺术动态| 麻豆理论在线观看| 国产精品永久| 欧美日韩精品一本二本三本| 国产伊人久久| 国产日韩一区| 免费成人av在线播放| 日韩和的一区二在线| 国产精久久久| 日韩精品国产欧美| 亚洲一区成人| 色婷婷狠狠五月综合天色拍| 欧美韩一区二区| 日欧美一区二区| 日韩视频在线一区二区三区| 成人精品国产亚洲| 国产亚洲欧美日韩精品一区二区三区 | 亚洲精品进入| 精品1区2区3区4区| 香蕉成人av| 福利在线一区| 国产精品亚洲人成在99www| 久久电影一区| 亚洲v在线看| 国产成人久久精品一区二区三区| 国产欧美大片| 日本不卡视频在线观看| 亚洲在线久久| 欧美专区在线| 亚洲欧美一区在线| 久久视频国产| 激情欧美一区二区三区| 伊人久久av| 日韩免费一区| 久久精品1区| 蜜臀国产一区| 超级白嫩亚洲国产第一| 国产精品国产三级国产在线观看| 亚洲精品国产日韩| 中文字幕av一区二区三区四区| 99国内精品| 99热免费精品| 日韩影院在线观看| 日韩制服丝袜先锋影音| 天堂va蜜桃一区二区三区| 91精品成人| 亚洲免费黄色| 免播放器亚洲一区| 蜜臀久久99精品久久久画质超高清 | 日韩亚洲在线| 亚洲一区二区免费看| 夜夜嗨av一区二区三区网站四季av| 自拍日韩欧美| 亚洲深夜福利| 老牛国产精品一区的观看方式| 麻豆精品91| 亚洲精品三级| 欧美视频久久| 久久久免费人体| 国产欧洲在线| 久久久久久自在自线| 午夜av成人| 午夜在线精品偷拍| 中文字幕一区二区三区日韩精品 | 成人在线超碰| 91精品蜜臀一区二区三区在线 | 欧美91在线|欧美| 国产精品99一区二区三区| 亚洲精品**中文毛片| 天堂日韩电影| 国产伊人精品| 三级欧美在线一区| 国产精品一区二区av交换| 精品国产乱码久久久久久1区2匹| 欧美成人精品三级网站| 亚洲精品2区| 亚洲一二av| 久久精品国产久精国产| 一区二区精品伦理...| 欧洲亚洲一区二区三区| 亚洲欧美日韩国产| 国产精品一区高清| 精品欧美一区二区三区在线观看| 蜜臀久久99精品久久一区二区| 亚洲深深色噜噜狠狠爱网站| 国产情侣久久| 日韩毛片视频| av不卡在线| 国产精品一区二区99| 九色porny丨国产首页在线| 女同性一区二区三区人了人一| 四虎精品永久免费| 福利一区二区| 免费美女久久99| 国产精品成人3p一区二区三区| 国产成人精品三级高清久久91 | 影音先锋久久精品| 精品视频一区二区三区在线观看| 婷婷国产精品| 国产日韩欧美一区二区三区| 亚洲成人不卡| 日韩黄色在线观看| 欧美成人a交片免费看| 亚洲天堂av资源在线观看| 久久精品国产亚洲一区二区三区| 亚洲女同一区| 欧美视频一区| 欧美亚洲国产激情| 亚洲精品亚洲人成在线观看| 国产激情在线播放| 亚洲色图国产| 免费观看亚洲| 日韩激情一区二区| 999久久久免费精品国产| 亚洲精品激情| 日韩欧美国产精品综合嫩v| 天堂va在线高清一区| 久久久久久黄| 国产精品一区二区精品| 黄页网站一区| 国产一区二区精品久| 亚洲免费毛片| 欧美日韩一二三四| 欧美日韩亚洲一区二区三区在线| 欧美日韩精品免费观看视欧美高清免费大片| 亚洲三区欧美一区国产二区| 日韩免费福利视频| 国产精品99久久久久久董美香| 老牛国产精品一区的观看方式|